일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- TAIL
- CUDA
- dmesg
- netplan
- ifconfig
- nvidia
- A100
- 엔비디아 도커
- grub
- 우분투
- nvidia-docker
- 우분투 22.04 패스워드 초기화
- V100
- ethtool
- 패스워드초기화
- Ubuntu 22.04
- 리눅스 기본명령어
- sudoer
- docker
- 도커
- passwd
- NGC
- 도커 설치
- python
- uname
- 우분투패스워드초기화
- Cat
- TensorFlow
- sysstat
- 모니터링
- Today
- Total
또이리의 Server Engineer
FIO test - NVMe / SSD / HDD 속도 테스트 본문
FIO test - NVMe / SSD / HDD 속도 테스트
FIO test HDD 속도 테스트
이번 스토리는 하드디스크의 read, write IOPS와 bandwidth를 테스트할 수 있는 FIO에 대해서 알아보겠습니다. 테스트 환경은 ubuntu 18.04.4 기반입니다.
아이옵스(Input/Output Operations Per Second, IOPS)는 HDD, SSD, SAN 같은 컴퓨터 저장 장치를 벤치 마크하는 데 사용되는 성능 측정 단위다.
대역폭(bandwidth)은 주어진 시간 내에 얼마나 많은 정보가 데이터 연결을 통과할 수 있는지를 나타냅니다. 대개 초당 메가비트 (Mbps) 또는 초당 기가비트 (Gbps)와 같이 초당 비트 수 (bps)의 배수로 측정됩니다.
fio에서는 대역폭이 비트가 아닌, MiB/s 메비 바이트 퍼 세컨드, MB/s 메가바이트 퍼 세컨드로 표시됩니다.
ubuntu 18.04.4 server
Linux 4.15.0-76-generic
gcc 7.5.0
CentOS도 설치하고 테스트하는 방법은 대동소이합니다.
우선 FIO를 설치하기 전에 gcc compiler와 libaio엔진을 사용하기 위해서 libaio-devel을 설치합니다.
root@ubuntu:~# apt-get update
Hit:1 http://us.archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://us.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Fetched 252 kB in 2s (125 kB/s)
Reading package lists... Done
root@ubuntu:~# apt-get install gcc libaio-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
gcc is already the newest version (4:7.4.0-1ubuntu2.3).
libaio-dev is already the newest version (0.3.110-5ubuntu0.1).
0 upgraded, 0 newly installed, 0 to remove and 172 not upgraded.
root@ubuntu:~# gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
root@ubuntu:~# dpkg -l | grep -i libaio
ii libaio-dev:amd64 0.3.110-5ubuntu0.1 amd64 Linux kernel AIO access library - development files
ii libaio1:amd64 0.3.110-5ubuntu0.1 amd64 Linux kernel AIO access library - shared library
root@ubuntu:~#
root@ubuntu:~# dpkg -l | grep -i binutils
ii binutils 2.30-21ubuntu1~18.04.4 amd64 GNU assembler, linker and binary utilities
ii binutils-common:amd64 2.30-21ubuntu1~18.04.4 amd64 Common files for the GNU assembler, linker and binary utilities
ii binutils-x86-64-linux-gnu 2.30-21ubuntu1~18.04.4 amd64 GNU binary utilities, for x86-64-linux-gnu target
ii libbinutils:amd64 2.30-21ubuntu1~18.04.4 amd64 GNU binary utilities (private shared library)
root@ubuntu:~#
추가로 binutils의 버전도 확인해 줍니다.
하드 디스크나 SSD의 성능을 비교 테스트할 때 OS, kernel, compiler, binutils version은 동일하게 설정해주시고 테스트하면 됩니다. 아무래도 객관적인 output을 얻을 수 있습니다.
install fio
ubuntu install
apt-get update
apt-get install fio
root@ubuntu:~# apt-get update
Hit:1 http://us.archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://us.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Fetched 252 kB in 2s (109 kB/s)
Reading package lists... Done
root@ubuntu:~# apt-get install fio
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
ibverbs-providers libibverbs1 libnl-route-3-200 libnspr4 libnss3
libpython-stdlib libpython2.7-minimal libpython2.7-stdlib librados2 librbd1
librdmacm1 python python-minimal python2.7 python2.7-minimal
Suggested packages:
gnuplot gfio python-scipy python-doc python-tk python2.7-doc binfmt-support
The following NEW packages will be installed:
fio ibverbs-providers libibverbs1 libnl-route-3-200 libnspr4 libnss3
libpython-stdlib libpython2.7-minimal libpython2.7-stdlib librados2 librbd1
librdmacm1 python python-minimal python2.7 python2.7-minimal
0 upgraded, 16 newly installed, 0 to remove and 172 not upgraded.
Need to get 0 B/9,815 kB of archives.
After this operation, 40.0 MB of additional disk space will be used.
Do you want to continue? [Y/n]
root@ubuntu:~# fio --version
fio-3.1
설치 후
fio --version으로 버전을 확인합니다.
centOS install
yum install git gcc libaiodevel
git clone https://github.com/axboe/fio.git
cd fio
./configure
Makefile(컴파일 옵션 설정 파일)이 만들어집니다.
소스를 컴파일하는 시스템의 환경에 맞는 Makefile이 생성됩니다.
make
소스코드를 실제로 컴파일해서 binary 파일을 생성합니다.
make install
만들어진 binary 파일을 지정된 디렉터리로 이동시켜 줍니다.
위와 같은 방법으로 설치가 완료되었으면, 실행 방법과 옵션에 대해서 알아보겠습니다.
fio 사용방법과 옵션
사용 방법은 스크립트를 작성해서 사용하는 방법과 커맨드 라인에 명령어와 옵션을 이용해서 실행시키는 방법이 있습니다.
실행 명령어
스크립트로 실행
fio 스크립트 파일
스크립트 파일을 작성하는 법은 아래와 같이 [global]에 공통적으로 적용될 파라미터 값을 작성해주신 다음에 개별적으로 [임의의 테스트 제목] 아래 파라미터 값을 작성하시면 됩니다.
[global]
ioengine=libaio
filename=/dev/nvme0n1
group_reporting=1
direct=1
verify=0
norandommap=1
size=100%
time_based=1
runtime=300s
ramp_time=10
randrepeat=0
refill_buffers
log_avg_msec=1000
log_max_value=1
unified_rw_reporting=1
percentile_list=50:99:99.9:99.99:99.999
[4k_randwrite_qd16_4w]
stonewall
bs=4k
rw=randwrite
iodepth=4
numjobs=4
[4k_randread_qd16_4w]
stonewall
bs=4k
rw=randread
iodepth=4
numjobs=4
root@ubuntu:~# fio fio4krandrw
4k-randrw 1:64: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
fio-3.1
Starting 1 process
Jobs: 1 (f=0): [f(1)][100.0%][r=43.1MiB/s,w=0KiB/s][r=11.0k,w=0 IOPS][eta 00m:00s]
4k-randrw 1:64: (groupid=0, jobs=1): err= 0: pid=4462: Sun Dec 27 00:57:28 2020
mixed: IOPS=11.4k, BW=44.7MiB/s (46.9MB/s)(447MiB/10001msec)
slat (usec): min=6, max=1164, avg=40.73, stdev= 9.52
clat (nsec): min=1172, max=8986.7k, avg=44524.27, stdev=39935.52
lat (usec): min=56, max=8997, avg=85.78, stdev=41.31
clat percentiles (usec):
| 50.000th=[ 49], 99.000th=[ 88], 99.900th=[ 141], 99.990th=[ 553],
| 99.999th=[ 8717]
bw ( KiB/s): min=11808, max=38704, per=50.05%, avg=22920.39, stdev=9793.22, samples=38
iops : min= 2952, max= 9676, avg=5729.97, stdev=2448.33, samples=38
lat (usec) : 2=0.68%, 4=0.01%, 10=0.01%, 20=0.02%, 50=72.34%
lat (usec) : 100=26.30%, 250=0.62%, 500=0.02%, 750=0.01%
lat (msec) : 2=0.01%, 10=0.01%
cpu : usr=0.11%, sys=68.54%, ctx=114498, majf=0, minf=4
IO depths : 1=198.5%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwt: total=114495,0,0, short=0,0,0, dropped=0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
MIXED: bw=44.7MiB/s (46.9MB/s), 44.7MiB/s-44.7MiB/s (46.9MB/s-46.9MB/s), io=447MiB (469MB), run=10001-10001msec
Disk stats (read/write):
sda: ios=159407/67870, merge=0/10, ticks=11140/4824, in_queue=15956, util=79.43%
root@ubuntu:~#
위와 같이 [global]에는 공통적으로 적용될 파라미터 값을 작성해줍니다. 테스트에 사용할 io엔진, 파일 네임이나 장치, 버퍼 사용 여부, 테스트 파일 사이즈, 여기서 사이즈를 100%로 디스크 전체를 사용할 것인지 1G와 같은 형식으로 파일 사이즈를 지정할 수도 있습니다.
위의 예는 기본으로 사용하는 파라미터 값이며, 자세한 파라미터 값은 아래 매뉴얼 사이트에서 확인해 보시면 됩니다.
커맨드 라인에서 실행
fio 파라미터 값
디렉터리와 파일 네임 파일 사이즈 지정(디스크 마운트 이후, 테스트 가능)
fio --directory=/fio --name fio_test --randrepeat=0 --ioengine=libaio --direct=1 --rw=randread --bs=4k --size=1G --numjobs=16 --iodepth=64 --time_based --runtime=180 --group_reporting --norandommap
root@ubuntu:~# fio --directory=/mnt --name fio_test --randrepeat=0 --ioengine=libaio --direct=1 --rw=randread --bs=4k --size=1G --numjobs=16 --iodepth=64 --time_based --runtime=10 --group_reporting --norandommap
fio_test: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
...
fio-3.1
Starting 16 processes
fio_test: Laying out IO file (1 file / 1024MiB)
Jobs: 16 (f=16): [r(16)][4.2%][r=90.3MiB/s,w=0KiB/s][r=23.1k,w=0 IOPS][eta 04m:12s]
fio_test: (groupid=0, jobs=16): err= 0: pid=4101: Sun Dec 27 00:33:04 2020
read: IOPS=19.4k, BW=75.6MiB/s (79.3MB/s)(757MiB/10009msec)
slat (nsec): min=954, max=267810k, avg=788253.25, stdev=5469317.77
clat (nsec): min=347, max=632082k, avg=51091404.50, stdev=43135762.22
lat (nsec): min=1342, max=679232k, avg=51879759.93, stdev=43904993.16
clat percentiles (usec):
| 1.00th=[ 143], 5.00th=[ 17957], 10.00th=[ 21365], 20.00th=[ 34341],
| 30.00th=[ 38011], 40.00th=[ 39584], 50.00th=[ 41157], 60.00th=[ 42730],
| 70.00th=[ 46924], 80.00th=[ 59507], 90.00th=[ 81265], 95.00th=[116917],
| 99.00th=[270533], 99.50th=[320865], 99.90th=[417334], 99.95th=[513803],
| 99.99th=[574620]
bw ( KiB/s): min= 8, max=13341, per=6.26%, avg=4847.51, stdev=2261.64, samples=319
iops : min= 2, max= 3335, avg=1211.55, stdev=565.35, samples=319
lat (nsec) : 500=0.01%, 750=0.01%, 1000=0.01%
lat (usec) : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.02%, 50=0.06%
lat (usec) : 100=0.12%, 250=2.68%, 500=0.34%, 750=0.05%, 1000=0.03%
lat (msec) : 2=0.04%, 4=0.10%, 10=0.15%, 20=3.77%, 50=65.12%
lat (msec) : 100=20.47%, 250=5.81%, 500=1.14%, 750=0.05%
cpu : usr=0.09%, sys=0.79%, ctx=8275, majf=0, minf=1173
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.3%, >=64=99.5%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued rwt: total=193755,0,0, short=0,0,0, dropped=0,0,0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
READ: bw=75.6MiB/s (79.3MB/s), 75.6MiB/s-75.6MiB/s (79.3MB/s-79.3MB/s), io=757MiB (794MB), run=10009-10009msec
Disk stats (read/write):
sda: ios=178654/2, merge=84/2, ticks=1483596/0, in_queue=1490628, util=99.03%
root@ubuntu:~#
위와 같이 테스트가 완료되면 결과 값이 출력됩니다. --output=file과 같은 파라미터를 사용하면 아웃 파일이 현재 디렉터리에 생성됩니다.
디바이스 장치와 디스크 전체 지정(별도로 디스크를 마운트 하지 않아도 테스트 가능)
fio --name=/dev/nvme1n1 --randrepeat=0 --ioengine=libaio --direct=1 --rw=randread --bs=4k --size=100% --numjobs=16 --iodepth=64 --time_based --runtime=180 --group_reporting --norandommap
파라미터(옵션)가 어마어마하기 때문에 아래 매뉴얼 사이트를 참고하시게 편합니다.
fio menual
filename=[filename or raw_device] : 테스트 디바이스 or 파일 경로를 설정합니다. (여러 경로를 동시에 사용할 때에는 콜론 ':' 으로 연결합니다.)
directory=[dir경로] : 디렉터리 경로를 설정합니다.
nrfiles=[int] : job 당 파일 수를 설정합니다.
size=[file_size] : job 당 총 파일 사이즈를 설정합니다.
filesize=[irange] : 파일 1개 당 사이즈를 설정합니다. (범위로 지정 가능, 범위 지정 시 fio가 랜덤으로 지정)
bs=int,[int] : Block 사이즈를 설정합니다. (복수 지정 가능, 복수 지정 시 fio가 랜덤으로 지정)
blocksize_range=[irange] : Block 사이즈의 범위를 설정합니다. (범위 지정 시 fio가 랜덤으로 지정)
rw=[I/O 종류] : write / read / randwrite / randread / readwrite (rw) / randrw
numjobs=[int] : job 개수를 설정합니다. (동일한 워크로드를 동시에 실행, multi processes / threads)
thread : thread 생성 시 fork 대신 pthread_create를 사용합니다.
ioengine=[I/O 방법] : 테스트에 사용할 IO엔진을 선택합니다.
ramp_time=[int] : 각 테스트 사이의 공백 시간을 설정합니다.
iodepth=[int] : Queue Depth
runtime=[int] : 테스트 진행 시간을 설정합니다. (초 단위)
time_based : runtime 시간만큼 I/O 를 실행합니다. (파일 사이즈가 필요 없습니다.)
direct=[bool] : True 일 경우 Direct I/O로 수행합니다. False 일 경우 Buffered I/O로 수행합니다.
norandommap : Random 워크로드 시 I/O 위치를 과거 I/O 위치를 고려하지 않습니다.
group_reporting : Job 별 리포팅이 아닌 그룹 별 리포팅 출력합니다.
stonewall : 작업을 구분하는 파라미터.
테스트가 끝나면 위와 같이 결괏값이 출력됩니다. IOPS와 BW의 값이 출력됩니다.
'Linux Engineer' 카테고리의 다른 글
Linux time / date 설정 명령어 - 날짜 / 시간 (0) | 2021.02.16 |
---|---|
TensorFlow install (NVIDA NGC) 텐서플로우 설치 (0) | 2021.01.21 |
리눅스 ls 명령어 - 기본 명령어 (0) | 2020.12.09 |
우분투 패스워드 초기화 ubuntu passwd reset (5) | 2020.11.25 |
루트 권한 부여하기 리눅스 - root permission (0) | 2020.11.22 |