본문 바로가기

리눅스

fio를 설치하고 디스크의 읽기 및 쓰기 속도를 측정하는 방법

728x90

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: 벤치마크 종료 후 파일 시스템 캐시를 비우도록 지정합니다.
728x90

사용 예시

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 도구를 사용하여 디스크의 읽기/쓰기 속도를 측정하는 방법을 간단히 소개해드렸습니다. 다양한 옵션을 사용하여 벤치마크를 구성하면서 디스크의 성능을 테스트해보시기 바랍니다.

 

728x90