2022. 5. 23. 21:02ㆍ✨ Linux
오늘 fio 라는 명령어를 처음 사용해 봤다.
fio(Flexible IO Tester)는 디스크에 I/O 부하를 줘서 성능을 측정할 수 있는 도구이다.
disk 성능 테스트의 목적은 물리 디바이스가 잘 동작하는지 1차적으로 확인하는 것이다.
그리고 application을 올린 다음에 다시 테스트 하여 본래의 성능 보다 너무 낮으면 application 설정의 튜닝을 고려하는 지표로도 사용할 수 있다고 한다.
fio를 사용하면 random read/write 방식으로 disk에 부하를 줄 수 있다.
ramdom read/write
disk read/write 방식에는 순차(sequential)/랜덤(random) 방식이 있다.
random read/write가 일어나는 상황은 다음과 같이 가정할 수 있다. 여러 프로세스가 동시에 동작하며 disk를 사용할 때 하나의 서비스에 대한 파일들이 디스크의 여기저기에 흩어져서 저장되게 된다. 보통 PC나 서버를 사용할 때 한번에 하나의 작업만 하는 경우는 거의 없다. (ex. PC 카카오톡 하면서 크롬으로 유튜브 보기) 따라서 random read/write 방식이 실제 환경의 접근 패턴에 더 가깝다고 할 수 있다. fio는 random read/write를 지원한다.
옵션 설명
다음 명령어는 /dev/sdb 디스크의 10GB에 block 4KiB 단위로 데이터를 60분간 read 한다는 뜻이다.
세부적인 옵션도 한번 알아보도록 한다.
# fio --filename=/dev/sdb --direct=1 --sync=1 --rw=randread --stonewall --bs=4k --numjobs=16 --iodepth=16 --runtime=60 --time_based --group_reporting --name=bigt --size=10G
- --filename : 부하를 줄 위치를 지정한다
- --direct : 1(true)이면 non-buffered I/O이다. default는 0(false)
- --sync : 1(true)이면 write 작업에 대해 동기화를 한다. 데이터가 캐시 같이 휘발성의 공간이 아닌 디스크에 쓰여졌을 때 call 을 반환한다.
- --rw : I/O 패턴을 지정한다. read/write/randread/randwrite 등의 옵션이 있다.
- --stonewall : 진행 중인 job이 완료될 때까지 새로운 job을 시작 안하고 대기한다.
- --bs : 제일 중요한 것 같다. Block Size를 의미한다. read 혹은 write할 block의 크기를 의미한다. 기본값은 4KiB(=4096byte)이다.
- --numjobs : 주어진 작업을 동시에 진행할 독립적인 thread나 process의 개수를 의미한다.
- --runtime : 부하를 줄 시간(초단위)
- --time_based : runtime으로 지정한 시간 안에 지정한 부하가 끝나더라도 설정한 시간이 될 때까지 테스트를 반복한다.
- --group_reporting : 결과를 job이 아닌 group 별로 보여준다.
- --name : 해당 job의 이름을 지정한다.
- --size : 해당 job에서 부하 줄 디스크 용량을 지정한다. 만약에 지정을 안하면 명시한 디바이스 전체에 대해 부하 테스트를 한다.
아래 명령어도 비슷하다. 다만 randwrite로 disk write 작업을 한다.
# fio --filename=/dev/sdb --direct=1 --sync=1 --rw=randwrite --stonewall --bs=4k --numjobs=16 --iodepth=16 --runtime=60 --time_based --group_reporting --name=bigt --size=10G
결과
이렇게 부하를 주면 결과는 다음과 같이 나타난다.
[root@wglee-testserver ~]# fio --filename=/dev/vdb --direct=1 --sync=1 --rw=randread --stonewall --bs=4k --numjobs=16 --iodepth=16 --runtime=60 --time_based --group_reporting --name=bigt --size=10G
bigt: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=16
fio-3.7
Starting 16 processes
Jobs: 16 (f=16): [r(16)][100.0%][r=59.0MiB/s,w=0KiB/s][r=15.1k,w=0 IOPS][eta 00m:00s]
bigt: (groupid=0, jobs=16): err= 0: pid=15066: Mon May 23 16:01:25 2022
read: IOPS=12.7k, BW=49.5MiB/s (51.9MB/s)(2971MiB/60014msec)
clat (usec): min=53, max=681160, avg=1257.59, stdev=6374.48
lat (usec): min=54, max=681161, avg=1258.25, stdev=6374.50
clat percentiles (usec):
| 1.00th=[ 355], 5.00th=[ 490], 10.00th=[ 570], 20.00th=[ 676],
| 30.00th=[ 766], 40.00th=[ 848], 50.00th=[ 938], 60.00th=[ 1037],
| 70.00th=[ 1156], 80.00th=[ 1319], 90.00th=[ 1614], 95.00th=[ 2008],
| 99.00th=[ 4490], 99.50th=[ 6718], 99.90th=[ 49546], 99.95th=[104334],
| 99.99th=[316670]
bw ( KiB/s): min= 16, max= 4960, per=6.26%, avg=3171.61, stdev=917.69, samples=1918
iops : min= 4, max= 1240, avg=792.88, stdev=229.42, samples=1918
lat (usec) : 100=0.06%, 250=0.46%, 500=5.02%, 750=22.65%, 1000=28.47%
lat (msec) : 2=38.29%, 4=3.84%, 10=0.93%, 20=0.10%, 50=0.07%
lat (msec) : 100=0.05%, 250=0.04%, 500=0.01%, 750=0.01%
cpu : usr=0.45%, sys=1.90%, ctx=760556, majf=0, minf=622
IO depths : 1=100.0%, 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 rwts: total=760583,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=16
Run status group 0 (all jobs):
READ: bw=49.5MiB/s (51.9MB/s), 49.5MiB/s-49.5MiB/s (51.9MB/s-51.9MB/s), io=2971MiB (3115MB), run=60014-60014msec
Disk stats (read/write):
vdb: ios=758922/0, merge=0/0, ticks=893372/0, in_queue=889486, util=99.40%
결과 데이터가 엄청 많은데 주로 이 부분을 보면 될 것 같다.
초당 몇 MB의 데이터를 read 했는지 알 수 있다.
read: IOPS=12.7k, BW=49.5MiB/s (51.9MB/s)
동일 서버에 세션을 하나 더 열어서 sar로 fio 명령으로 인해 디스크에 write 혹은 read 되는 값을 확인 할 수도 있다.
[root@wglee-testserver sa]# sar -dp 1 | grep vdb
04:00:30 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
04:00:34 PM vdb 12856.94 102855.56 0.00 8.00 20.89 1.60 0.11 138.61
04:00:35 PM vdb 13887.67 111101.37 0.00 8.00 21.09 1.48 0.10 136.58
04:00:36 PM vdb 18297.06 146376.47 0.00 8.00 22.49 1.29 0.08 146.76
04:00:37 PM vdb 15250.70 122005.63 0.00 8.00 21.26 1.37 0.09 140.42
참고문서
'✨ Linux' 카테고리의 다른 글
NFS 자동 마운트 autofs 설정하기 (0) | 2022.06.04 |
---|---|
anacrontab 사용하여 job 스케줄링 하기 (0) | 2022.06.03 |
Linux 시스템 복구 방법 (Rescue, Single-user, Emergency mode) (0) | 2022.05.15 |
stratis 방식으로 파일 시스템 구현해 보기 (0) | 2022.05.11 |
NetworkManager - nmcli 명령어로 리눅스 네트워크 설정하기 (0) | 2022.04.27 |