또이리의 Server Engineer

FIO test - NVMe / SSD / HDD 속도 테스트 본문

Linux Engineer

FIO test - NVMe / SSD / HDD 속도 테스트

또이리 2020. 12. 27. 01:22

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 

 

axboe/fio

Flexible I/O Tester. Contribute to axboe/fio development by creating an account on GitHub.

github.com

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

linux.die.net/man/1/fio

 

fio(1): flexible I/O tester - Linux man page

fio(1) - Linux man page Name fio - flexible I/O tester Synopsis fio [options] [jobfile]... Description fio is a tool that will spawn a number of threads or processes doing a particular type of I/O action as specified by the user. The typical use of fio is

linux.die.net

 

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 : 작업을 구분하는 파라미터.

 

fio test

테스트가 끝나면 위와 같이 결괏값이 출력됩니다. IOPS와 BW의 값이 출력됩니다.

Comments