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 (초당 입출력 작업 수), 대기 시간 및 처리량과 같은 지표를 확인할 수 있습니다.
- 임의 읽기 테스트 결과 (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%
- Disk stats (읽기/쓰기)
- dm-1: 읽기 작업(I/O)이 5,961번 수행되었으며, 디스크의 활용률은 99.70%입니다.
- sda: 읽기 작업(I/O)이 5,994번 수행되었으며, 디스크의 활용률은 99.54%입니다.
- latency(대기 시간) 분석
- 평균 응답 시간은 79.93msec로 나타났습니다.
- 대부분의 I/O 작업이 250msec 이하의 대기 시간에 완료되었으며, 99.99%의 작업도 3,608msec 내에 완료되었습니다.
- 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
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 정도입니다.
fio --name=random_read --ioengine=libaio --rw=randread --bs=4k --iolength=16 --size=2g --runtime=30 --direct=1
728x90
'리눅스' 카테고리의 다른 글
OpenSSL을 사용하여 자체 서명된 SSL/TLS 인증서를 생성하는 방법 (0) | 2024.01.18 |
---|---|
SSL 인증서를 PFX에서 JKS로 변환하는 방법 (0) | 2024.01.18 |
[draft] SSH 호스트 키가 변경되었을 때 발생하는 경고 메시지를 해결하는 방법 (0) | 2024.01.16 |
Ansible에서 사용자 정의 팩트를 정의하고 사용하는 방법 (0) | 2024.01.16 |
Ansible Facts (0) | 2024.01.15 |