본문 바로가기

리눅스

fio 도구를 사용하여 디스크 I/O 성능을 측정하는 방법

728x90

fio 도구를 사용하여 디스크 I/O 성능을 측정하는 방법

fio 도구는 Linux 및 Windows에서 사용할 수 있는 무료 오픈 소스 디스크 I/O 도구입니다. 다양한 유형의 I/O 작업을 시뮬레이션하여 디스크의 성능을 측정할 수 있습니다.

fio 설치

  • Ubuntu 기반 시스템
sudo apt-get update
sudo apt-get install fio
  • CentOS 기반 시스템
sudo yum install fio

fio 기본적인 문법

fio [options] [job options] <job file(s)>
  • fio 매개변수
    • ioengine : I/O 작업을 수행하는 엔진을 지정합니다. 일반적으로 libaio 엔진을 사용합니다.
    • rw : I/O 작업의 유형을 지정합니다. 순차 읽기, 순차 쓰기, 임의 읽기, 임의 쓰기를 지정할 수 있습니다.
    • bs : I/O 작업의 단위 크기를 지정합니다. 일반적으로 1KB, 4KB, 1MB, 4MB 등을 사용합니다.
    • iodepth : I/O 작업을 동시에 수행할 수 있는 최대 스레드 수를 지정합니다.
    • runtime : 테스트를 실행할 시간을 지정합니다.
$ fio
No job(s) defined

fio-3.28
fio [options] [job options] <job file(s)>
  --debug=options       Enable debug logging. May be one/more of: process,file,io,mem,blktrace,verify,random,parse, diskutil,job,mutex,profile,time,net,rate,compress, steadystate,helperthread,zbd
  --parse-only          Parse options only, don't start any IO
  --merge-blktrace-only Merge blktraces only, don't start any IO
  --output              Write output to file
  --bandwidth-log       Generate aggregate bandwidth logs
  --minimal             Minimal (terse) output
  --output-format=type  Output format (terse,json,json+,normal)
  --terse-version=type  Set terse version output format (default 3, or 2 or 4)
  --version             Print version info and exit
  --help                Print this page
  --cpuclock-test       Perform test/validation of CPU clock
  --crctest=[type]      Test speed of checksum functions
  --cmdhelp=cmd         Print command help, "all" for all of them
  --enghelp=engine      Print ioengine help, or list available ioengines
  --enghelp=engine,cmd  Print help for an ioengine cmd
  --showcmd             Turn a job file into command line options
  --eta=when            When ETA estimate should be printed May be "always", "never" or "auto"
  --eta-newline=t       Force a new line for every 't' period passed
  --status-interval=t   Force full status dump every 't' period passed
  --readonly            Turn on safety read-only checks, preventing writes
  --section=name        Only run specified section in job file, multiple sections can be specified
  --alloc-size=kb       Set smalloc pool to this size in kb (def 16384)
  --warnings-fatal      Fio parser warnings are fatal
  --max-jobs=nr         Maximum number of threads/processes to support
  --server=args         Start a backend fio server
  --daemonize=pidfile   Background fio server, write pid to file
  --client=hostname     Talk to remote backend(s) fio server at hostname
  --remote-config=file  Tell fio server to load this local job file
  --idle-prof=option    Report cpu idleness on a system or percpu basis (option=system,percpu) or run unit work calibration only (option=calibrate)
  --inflate-log=log     Inflate and output compressed log
  --trigger-file=file   Execute trigger cmd when file exists
  --trigger-timeout=t   Execute trigger at this time
  --trigger=cmd         Set this command as local trigger
  --trigger-remote=cmd  Set this command as remote trigger
  --aux-path=path       Use this path for fio state generated files

Fio was written by Jens Axboe <axboe@kernel.dk>

fio 설정 파일 예제

  • fio 테스트 파일 작성
    • fio는 테스트 작업을 정의하는 파일이 필요합니다.
vim mytest.fio
[global]
ioengine=libaio
iodepth=16
bs=4k
size=1G
runtime=30s
time_based
end_fsync=1

[rw_test]
rw=randread
filename=/tmp/test/testfile
  • fio 실행
    • 작성한 설정 파일을 사용하여 fio를 실행합니다.
fio mytest.fio
$ fio mytest.fio
rw_test: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
fio-3.28
Starting 1 process
rw_test: Laying out IO file (1 file / 1024MiB)
Jobs: 1 (f=1): [r(1)][100.0%][r=664KiB/s][r=166 IOPS][eta 00m:00s]
rw_test: (groupid=0, jobs=1): err= 0: pid=335966: Thu Jan 18 12:46:44 2024
  read: IOPS=199, BW=799KiB/s (818kB/s)(23.4MiB/30002msec)
...
Run status group 0 (all jobs):
   READ: bw=799KiB/s (818kB/s), 799KiB/s-799KiB/s (818kB/s-818kB/s), io=23.4MiB (24.6MB), run=30002-30002msec

Disk stats (read/write):
    dm-1: ios=5961/186, merge=0/0, ticks=29640/2644, in_queue=32284, util=99.70%, aggrios=5994/179, aggrmerge=0/8, aggrticks=29818/2425, aggrin_queue=32244, aggrutil=99.54%
  sda: ios=5994/179, merge=0/8, ticks=29818/2425, in_queue=32244, util=99.54%
  • 테스트 결과 분석

fio는 각 작업에 대한 결과를 자세히 출력합니다. 예를 들어, IOPS (초당 입출력 작업 수), 대기 시간 및 처리량과 같은 지표를 확인할 수 있습니다.

 

  1. 임의 읽기 테스트 결과 (randread)
    • IOPS(I/O Operations Per Second): 199
    • 대역폭(Bandwidth): 799 KiB/s (818 kB/s)
    • 테스트 기간: 30,002msec (약 30초)
    • 평균 응답 시간(latency): 79.93msec
    • CPU 사용량: 사용자 0.20%, 시스템 0.63%
  2. Disk stats (읽기/쓰기)
    • dm-1: 읽기 작업(I/O)이 5,961번 수행되었으며, 디스크의 활용률은 99.70%입니다.
    • sda: 읽기 작업(I/O)이 5,994번 수행되었으며, 디스크의 활용률은 99.54%입니다.
  3. latency(대기 시간) 분석
    • 평균 응답 시간은 79.93msec로 나타났습니다.
    • 대부분의 I/O 작업이 250msec 이하의 대기 시간에 완료되었으며, 99.99%의 작업도 3,608msec 내에 완료되었습니다.
  4. bw(I/O 대역폭) 분석
    • I/O 대역폭은 최소 8 KiB/s에서 최대 1,032 KiB/s까지 변동하였습니다.
    • 평균 대역폭은 837.71 KiB/s로 나타났습니다.

결과적으로, 이 임의 읽기 테스트에서는 디스크가 199의 IOPS로 작동하며, 평균 응답 시간이 79.93msec로 나타났습니다. 또한 디스크의 활용률은 높게 나타나며, I/O 대역폭은 799 KiB/s 정도입니다.

728x90

fio 도구를 사용하여 디스크 I/O 성능을 측정하는 몇 가지 예

  • 순차 읽기 성능 측정
fio --name=sequential_read --ioengine=libaio --rw=read --bs=1024k --iodepth=16 --size=2g --runtime=30 --direct=1
  • 순차 쓰기 성능 측정
fio --name=sequential_write --ioengine=libaio --rw=write --bs=1024k --iodepth=16 --size=2g --runtime=30 --direct=1
  • 임의 읽기 성능 측정
fio --name=random_read --ioengine=libaio --rw=randread --bs=4k --iodepth=16 --size=2g --runtime=30 --direct=1
  • 임의 쓰기 성능 측정
fio --name=random_write --ioengine=libaio --rw=randwrite --bs=4k --iodepth=16 --size=2g --runtime=30 --direct=1

fio1

fio 테스트 결과 분석

  • 임의 쓰기 테스트 결과 (randwrite)
    • IOPS(I/O Operations Per Second): 424
    • 대역폭(Bandwidth): 1,697 KiB/s (1,738 kB/s)
    • 테스트 기간: 30,042msec (약 30초)
    • 평균 응답 시간(latency): 37.68msec
    • CPU 사용량: 사용자 0.45%, 시스템 1.22%
  • Disk stats (읽기/쓰기)
    • dm-1: 쓰기 작업(I/O)이 12,753번 수행되었으며, 디스크의 활용률은 99.71%입니다.
    • sda: 쓰기 작업(I/O)이 12,797번 수행되었으며, 디스크의 활용률은 99.56%입니다.
  • latency(대기 시간) 분석
    • 평균 응답 시간은 37.68msec로 나타났습니다.
    • 대부분의 I/O 작업이 100msec 이하의 대기 시간에 완료되었으며, 99.99%의 작업도 376msec 내에 완료되었습니다.
  • bw(I/O 대역폭) 분석
    • I/O 대역폭은 최소 792 KiB/s에서 최대 1,832 KiB/s까지 변동하였습니다.
    • 평균 대역폭은 1,697 KiB/s로 나타났습니다.

결과적으로, 이 임의 쓰기 테스트에서는 디스크가 424의 IOPS로 작동하며, 평균 응답 시간이 37.68msec로 나타났습니다. 또한 디스크의 활용률은 높게 나타나며, I/O 대역폭은 1,697 KiB/s 정도입니다.

 

728x90