Server & Network/Linux

[Linux] 디스크 IOPS 측정 - FIO

AustinProd 2022. 5. 2. 23:30

이번 포스트에서는 IOPS에 대한 개념과 Linux에서 사용할 수 있는 IOPS 측정 툴 FIO의 사용 가이드를 정리한다. FIO 설치 방법과 실행 명령어 예시를 공유한다.

 

IOPS (Input/Output Operations Per Second) 란?

IOPS는 HDD, SDD와 같은 하드 디스크의 파일 입출력 속도를 나타내다. Input/Output Operations Per Second의 약자로 초당 어느 정도의 입출력 사양을 보여주는지 나타내는 단위로서 사용된다.

 

데이터 입출력 값은 CPU, RAM 사양에도 영향을 받지만, 하드 디스크에 저장되는 데이터 트래픽이 무겁다면 이 IOPS 성능에 따라 실행되는 응용 프로그램의 성능이 결정된다고 말할 수 있다.

 

FIO 설치

찾아보면 다양한 방법이 보이겠지만, 그 중 가장 쉽다고 생각되는 설치법이다. 아래 코드 블록을 참고해 apt-get을 업데이트하고 fio 패키지를 설치하면 된다. (Ubuntu 기준)

 

# apt-get 업데이트
sudo apt-get update

# fio 패키지 설치
sudo apt-get install fio

 

FIO 로 IOPS 측정

패키지 설치가 끝나면, 측정할 하드 디스크를 먼저 확인한다. lsblk 명령어로 디스크가 마운트 된 mountpoint를 체크하자. 나는 /node 디렉토리에 마운트한 nvme2n1 디바이스의 IOPS를 측정하려고 한다.

 

 

FIO 패키지는 실행 명령어 옵션에 적힌 설정에 맞춰 파일 입출력 테스트를 진행한다. 여기서 테스트는 더미 데이터를 디스크에서 읽고 쓰게 하는 작업이다.

 

아래 명령어는 총 3분동안 1GB 데이터(fio_test_file)를 /node 디렉토리에서 16회 실행할 것임을 나타내고 있다. 측정하고자하는 디스크가 마운트된 포인트를 잘 확인하는 게 중요하니 경로에 주의하며 명령어를 실행한다.

 

# (nvme2n1 디스크가 마운트된) node 디렉토리에 대한 IOPS 측정
fio --directory=/node --name fio_test_file --direct=1 --rw=randread --bs=4K --size=1G --numjobs=16 --time_based --runtime=180 --group_reporting --norandommap

 

실행 로그를 가져왔다. 나의 경우, 평균 981.72 KB/s의 IOPS를 확인했다. 자세한 내용은 코드 내 주석에 적어두었으니 참고하면 된다.

 

# IOPS 측정 프로세스 로그
...
fio-3.1

# 총 16회의 프로세스 실행
Starting 16 processes
fio_test_file: Laying out IO file (1 file / 1024MiB)
...

# IOPS 측정 결과
Jobs: 16 (f=16): [r(16)][100.0%][r=61.4MiB/s,w=0KiB/s][r=15.7k,w=0 IOPS][eta 00m:00s]
fio_test_file: (groupid=0, jobs=16): err= 0: pid=1031: Tue May  3 23:16:45 2022
   read: IOPS=15.7k, BW=61.3MiB/s (64.3MB/s)(10.8GiB/180002msec)
    clat (usec): min=168, max=40156, avg=1017.68, stdev=280.77
     lat (usec): min=168, max=40156, avg=1017.83, stdev=280.78
    clat percentiles (usec):
     |  1.00th=[  502],  5.00th=[  668], 10.00th=[  734], 20.00th=[  824],
     | 30.00th=[  881], 40.00th=[  947], 50.00th=[ 1004], 60.00th=[ 1057],
     | 70.00th=[ 1123], 80.00th=[ 1205], 90.00th=[ 1303], 95.00th=[ 1385],
     | 99.00th=[ 1598], 99.50th=[ 1745], 99.90th=[ 3097], 99.95th=[ 4047],
     | 99.99th=[ 6587]
   bw (  KiB/s): min= 3312, max= 9056, per=6.25%, avg=3927.37, stdev=268.24, samples=5752

   # 최소, 최대, 평균 IOPS 값을 확인할 수 있다.
   iops        : min=  828, max= 2264, avg=981.72, stdev=67.08, samples=5752

  lat (usec)   : 250=0.11%, 500=0.88%, 750=10.29%, 1000=38.62%
  lat (msec)   : 2=49.82%, 4=0.23%, 10=0.05%, 20=0.01%, 50=0.01%
  cpu          : usr=0.33%, sys=0.84%, ctx=2836533, majf=0, minf=155
  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 rwt: total=2826799,0,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: bw=61.3MiB/s (64.3MB/s), 61.3MiB/s-61.3MiB/s (64.3MB/s-64.3MB/s), io=10.8GiB (11.6GB), run=180002-180002msec

Disk stats (read/write):
  nvme2n1: ios=2833916/150, merge=0/7, ticks=2850014/241, in_queue=6504, util=99.89%