fio를 설치하고 디스크의 읽기 및 쓰기 속도를 측정하는 방법
fio(Flexible I/O Tester)는 다양한 형태의 입출력(I/O) 벤치마크를 수행할 수 있는 유연한 I/O 테스트 도구입니다. 리눅스에서 사용할 수 있으며 다양한 옵션으로 벤치마크를 구성할 수 있습니다.
fio 설치 방법
fio를 설치하려면 운영 체제의 패키지 관리자를 사용하여 설치할 수 있습니다.
- Ubuntu
sudo apt-get update
sudo apt-get install fio
- CentOS
sudo yum install fio
fio 명령어의 기본 구문
fio --name=mytest --ioengine=sync --rw=randwrite --bs=4k --size=1G --numjobs=1 --time_based --runtime=60s
fio 명령어의 주요 옵션
- --name: 벤치마크 작업의 이름을 지정합니다.
- --ioengine: 입출력 엔진을 지정합니다. 대부분의 경우 libaio를 사용합니다.
- --iodepth: 한 번에 처리하는 I/O 요청의 수를 지정합니다. 값이 클수록 I/O 처리량이 증가합니다.
- --rw: 입출력 작업의 패턴을 지정합니다. read(읽기) 또는 write(쓰기)를 사용할 수 있습니다.
- --bs: 입출력 블록 크기를 지정합니다.
- --numjobs: 벤치마크 작업의 동시 실행 수를 지정합니다.
- --size: 벤치마크 파일의 크기를 지정합니다.
- --runtime: 벤치마크를 실행할 시간을 지정합니다.
- --time_based: 벤치마크를 실행할 시간을 기반으로 실행합니다.
- --end_fsync: 벤치마크 종료 후 파일 시스템 캐시를 비우도록 지정합니다.
사용 예시
1. 디스크의 읽기 속도 측정
다음 명령어를 사용하여 디스크의 읽기 속도를 측정합니다.
sudo fio --name=read-test --ioengine=libaio --iodepth=16 --rw=read --bs=4k --numjobs=1 --size=1G --runtime=30s --time_based --end_fsync=1
위 명령어는 1GB의 파일에서 읽기 작업을 수행하는 벤치마크를 실행합니다. 벤치마크는 30초 동안 실행되며, 읽기 작업의 블록 크기는 4KB입니다.
$ sudo fio --name=read-test --ioengine=libaio --iodepth=16 --rw=read --bs=4k --numjobs=1 --size=1G --runtime=30s --time_based --end_fsync=1
read-test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
fio-3.28
Starting 1 process
read-test: Laying out IO file (1 file / 1024MiB)
Jobs: 1 (f=0): [f(1)][100.0%][r=87.6MiB/s][r=22.4k IOPS][eta 00m:00s]
read-test: (groupid=0, jobs=1): err= 0: pid=333291: Thu Jan 18 10:16:58 2024
read: IOPS=23.6k, BW=92.0MiB/s (96.5MB/s)(2761MiB/30003msec)
slat (nsec): min=1954, max=20114k, avg=40461.66, stdev=325009.58
clat (usec): min=5, max=153993, avg=637.24, stdev=1511.48
lat (usec): min=53, max=153995, avg=677.84, stdev=1532.13
clat percentiles (usec):
| 1.00th=[ 53], 5.00th=[ 53], 10.00th=[ 53], 20.00th=[ 54],
| 30.00th=[ 56], 40.00th=[ 57], 50.00th=[ 57], 60.00th=[ 58],
| 70.00th=[ 65], 80.00th=[ 2245], 90.00th=[ 2409], 95.00th=[ 2737],
| 99.00th=[ 4686], 99.50th=[ 4948], 99.90th=[ 5014], 99.95th=[ 5473],
| 99.99th=[16581]
bw ( KiB/s): min=65024, max=98304, per=100.00%, avg=94352.81, stdev=5903.45, samples=59
iops : min=16256, max=24576, avg=23588.20, stdev=1475.86, samples=59
lat (usec) : 10=0.01%, 100=76.54%, 250=0.06%, 500=1.69%, 750=0.01%
lat (usec) : 1000=0.01%
lat (msec) : 2=0.01%, 4=19.95%, 10=1.72%, 20=0.01%, 50=0.01%
lat (msec) : 250=0.01%
cpu : usr=3.80%, sys=11.43%, ctx=11055, majf=0, minf=31
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=706812,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=92.0MiB/s (96.5MB/s), 92.0MiB/s-92.0MiB/s (96.5MB/s-96.5MB/s), io=2761MiB (2895MB), run=30003-30003msec
Disk stats (read/write):
dm-1: ios=11018/25, merge=0/0, ticks=55072/660, in_queue=55732, util=98.80%, aggrios=11073/19, aggrmerge=1/6, aggrticks=55517/557, aggrin_queue=56074, aggrutil=98.66%
sda: ios=11073/19, merge=1/6, ticks=55517/557, in_queue=56074, util=98.66%
2. 디스크의 쓰기 속도 측정
다음 명령어를 사용하여 디스크의 쓰기 속도를 측정합니다.
sudo fio --name=write-test --ioengine=libaio --iodepth=16 --rw=write --bs=4k --numjobs=1 --size=1G --runtime=30s --time_based --end_fsync=1
위 명령어는 1GB의 파일에 쓰기 작업을 수행하는 벤치마크를 실행합니다. 벤치마크는 30초 동안 실행되며, 쓰기 작업의 블록 크기는 4KB입니다.
$ sudo fio --name=write-test --ioengine=libaio --iodepth=16 --rw=write --bs=4k --numjobs=1 --size=1G --runtime=30s --time_based --end_fsync=1
write-test: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
fio-3.28
Starting 1 process
write-test: Laying out IO file (1 file / 1024MiB)
Jobs: 1 (f=1): [W(1)][100.0%][eta 00m:00s]
write-test: (groupid=0, jobs=1): err= 0: pid=333341: Thu Jan 18 10:18:26 2024
write: IOPS=27.1k, BW=106MiB/s (111MB/s)(4096MiB/38671msec); 0 zone resets
slat (usec): min=2, max=429, avg= 4.32, stdev= 1.83
clat (usec): min=9, max=11912k, avg=552.29, stdev=70438.12
lat (usec): min=48, max=11912k, avg=556.77, stdev=70438.12
clat percentiles (usec):
| 1.00th=[ 68], 5.00th=[ 69], 10.00th=[ 70], 20.00th=[ 76],
| 30.00th=[ 78], 40.00th=[ 80], 50.00th=[ 102], 60.00th=[ 103],
| 70.00th=[ 105], 80.00th=[ 113], 90.00th=[ 115], 95.00th=[ 119],
| 99.00th=[ 131], 99.50th=[ 149], 99.90th=[ 178], 99.95th=[ 192],
| 99.99th=[ 355]
bw ( KiB/s): min=121296, max=873208, per=100.00%, avg=559232.53, stdev=207163.96, samples=15
iops : min=30324, max=218302, avg=139808.13, stdev=51790.99, samples=15
lat (usec) : 10=0.01%, 100=49.53%, 250=50.45%, 500=0.01%
lat (msec) : 4=0.01%, 100=0.01%, >=2000=0.01%
cpu : usr=5.17%, sys=13.61%, ctx=8534, majf=0, minf=97
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,1048577,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):
WRITE: bw=106MiB/s (111MB/s), 106MiB/s-106MiB/s (111MB/s-111MB/s), io=4096MiB (4295MB), run=38671-38671msec
Disk stats (read/write):
dm-1: ios=1/3838, merge=0/0, ticks=536/3546964, in_queue=3547500, util=78.30%, aggrios=1/5803, aggrmerge=0/488, aggrticks=537/7777814, aggrin_queue=7778350, aggrutil=91.25%
sda: ios=1/5803, merge=0/488, ticks=537/7777814, in_queue=7778350, util=91.25%
3-1. fio 테스트 작성
fio 테스트를 정의하는 설정 파일을 작성합니다.
vim mytest.fio
[global]
ioengine=sync
size=1G
[rw_test]
rw=randwrite
filename=/path/to/testfile
- ioengine: I/O 엔진으로 sync는 동기적인 I/O를 사용합니다.
- size: 테스트 파일의 크기입니다.
- rw: 읽기(read), 쓰기(write), 랜덤 읽기(randread), 랜덤 쓰기(randwrite) 등 여러 옵션이 있습니다.
- filename: 테스트할 파일의 경로를 지정합니다.
3-2.fio 테스트 실행
작성한 설정 파일을 사용하여 fio 테스트를 실행합니다.
fio mytest.fio
$ fio mytest.fio
rw_test: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=sync, iodepth=1
fio-3.28
Starting 1 process
rw_test: Laying out IO file (1 file / 1024MiB)
Jobs: 1 (f=1)
rw_test: (groupid=0, jobs=1): err= 0: pid=333417: Thu Jan 18 10:19:43 2024
write: IOPS=165k, BW=644MiB/s (676MB/s)(1024MiB/1589msec); 0 zone resets
clat (usec): min=3, max=203, avg= 4.62, stdev= 1.75
lat (usec): min=3, max=203, avg= 4.72, stdev= 1.75
clat percentiles (nsec):
| 1.00th=[ 3664], 5.00th=[ 3728], 10.00th=[ 3792], 20.00th=[ 3920],
| 30.00th=[ 4320], 40.00th=[ 4448], 50.00th=[ 4512], 60.00th=[ 4512],
| 70.00th=[ 4576], 80.00th=[ 4640], 90.00th=[ 4896], 95.00th=[ 6496],
| 99.00th=[ 9792], 99.50th=[10816], 99.90th=[21120], 99.95th=[43776],
| 99.99th=[61184]
bw ( KiB/s): min=629784, max=711856, per=100.00%, avg=661434.67, stdev=44138.50, samples=3
iops : min=157446, max=177964, avg=165358.67, stdev=11034.62, samples=3
lat (usec) : 4=23.07%, 10=76.18%, 20=0.65%, 50=0.07%, 100=0.03%
lat (usec) : 250=0.01%
cpu : usr=27.83%, sys=72.10%, ctx=1, majf=0, minf=11
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=0,262144,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
WRITE: bw=644MiB/s (676MB/s), 644MiB/s-644MiB/s (676MB/s-676MB/s), io=1024MiB (1074MB), run=1589-1589msec
Disk stats (read/write):
dm-1: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=0/0, aggrmerge=0/0, aggrticks=0/0, aggrin_queue=0, aggrutil=0.00%
sda: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
3-3.결과 분석
fio는 테스트가 완료되면 각 테스트의 결과를 자세히 표시합니다. 주목해야 할 주요 메트릭은 IOPS (초당 입출력 작업 수), 대기 시간, 밴드위스 등입니다.
- 읽기 테스트 결과 (randwrite)
- IOPS(I/O Operations Per Second): 165,000
- 대역폭(Bandwidth): 644 MiB/s (676 MB/s)
- 테스트 기간: 1,589msec
- 평균 응답 시간(latency): 4.62 microseconds
- CPU 사용량: 사용자 27.83%, 시스템 72.10%
대다수의 I/O 작업이 소요 시간 4.62 마이크로초 내에 완료되었으며, 시스템 CPU의 대부분이 I/O 작업을 처리하는 데 사용되었습니다.
- Disk stats (읽기/쓰기)
- dm-1: 읽기 작업(I/O) 및 쓰기 작업(I/O)이 0으로 표시되어 있습니다.
- sda: 디스크의 I/O 통계도 0으로 나타나 있습니다.
결과적으로, 이 테스트에서는 쓰기 작업을 수행했으며 쓰기 대역폭은 644 MiB/s이었습니다. 대부분의 I/O 작업이 매우 낮은 응답 시간 내에 처리되었으며, 시스템 CPU는 높은 활동을 나타냈습니다.
위와 같이 fio 도구를 사용하여 디스크의 읽기/쓰기 속도를 측정할 수 있습니다. 다양한 옵션을 사용하여 벤치마크를 구성할 수 있으며 필요한 경우 다양한 입출력 패턴을 사용하여 벤치마크를 수행할 수 있습니다.
이렇게 하면 디스크의 읽기/쓰기 속도에 대한 간단한 측정이 완료됩니다.
fio 도구를 사용하여 디스크의 읽기/쓰기 속도를 측정하는 방법을 간단히 소개해드렸습니다. 다양한 옵션을 사용하여 벤치마크를 구성하면서 디스크의 성능을 테스트해보시기 바랍니다.
'리눅스' 카테고리의 다른 글
포워드 프록시와 리버스 프록시의 차이점과 역할 (0) | 2023.04.07 |
---|---|
[리눅스] 리눅스에서 시간 변환하는 명령어 (0) | 2023.04.06 |
[리눅스] hdparm 설치 및 hdparm 도구로 디스크의 읽기/쓰기 속도를 측정하는 방법 (0) | 2023.04.05 |
[리눅스] dd 명령을 사용하여 디스크의 읽기/쓰기 속도를 측정하는 방법 (0) | 2023.04.05 |
디스크의 속도를 측정하는 방법 (0) | 2023.04.05 |