FIO를 활용한 클라우드 블록 스토리지 성능 측정 가이드

블록 스토리지 핵심 성능 지표

클라우드 환경에서 블록 스토리지의 성능을 평가할 때는 다음 세 가지 핵심 메트릭을 중심으로 분석합니다.

IOPS (초당 입출력 연산 수)

스토리지 드라이브가 1초당 처리할 수 있는 I/O 요청 횟수입니다. 하드웨어 컨트롤러의 특성에 따라 성능이 크게 달라집니다.

  • 총 IOPS: 읽기와 쓰기를 포함한 전체 연산량
  • 무작위 읽기 IOPS: 임의 위치에서의 읽기 작업 평균
  • 무작위 쓰기 IOPS: 임의 위치에서의 쓰기 작업 평균
  • 순차 읽기 IOPS: 연속된 블록에서의 읽기 작업 평균
  • 차 쓰기 IOPS: 연속된 블록에서의 쓰기 작업 평균

처리량 (Throughput)

단위 시간당 전송되는 데이터 양으로, MB/s 단위로 표현됩니다. 빅데이터 분석이나 로그 집계와 같은 대용량 순차 접근 워크로드에서 중요한 지표입니다.

지연 시간 (Latency)

I/O 요청 전송부터 완료 응답 수신까지 소요되는 시간입니다. 데이터베이스와 같은 지연 시간에 민감한 애플리케이션에서는 SSD 스토리지 사용을 권장합니다.

FIO 출력 결과 해석

다음은 실제 FIO 실행 결과를 분석하는 예시입니다.

$ fio --bs=4k --ioengine=libaio --iodepth=1 --direct=1 \
  --rw=read --time_based --runtime=600 --refill_buffers \
  --norandommap --randrepeat=0 --group_reporting \
  --name=disk-bench --size=100G --filename=/dev/vdb

disk-bench: (g=0): rw=read, bs=4096B-4096B, ioengine=libaio, iodepth=1
Starting 1 process

Jobs: 1 (f=1): [R(1)][100.0%][r=9784KiB/s,w=0KiB/s][r=2446,w=0 IOPS]
disk-bench: (groupid=0, jobs=1): err= 0: pid=22004
   read: IOPS=2593, BW=10.1MiB/s (6078MiB/600001msec)
    slat (usec): min=4, max=1532, avg=11.98, stdev=8.10
    clat (nsec): min=1021, max=66079k, avg=370367.39, stdev=395393.29
     lat (usec): min=44, max=66086, avg=382.88, stdev=399.21
    clat percentiles (usec):
     |  1.00th=[   42],  5.00th=[   44], 10.00th=[   45], 20.00th=[   46],
     | 30.00th=[   48], 40.00th=[   51], 50.00th=[  383], 60.00th=[  578],
     | 70.00th=[  644], 80.00th=[  701], 90.00th=[  783], 95.00th=[  865],
     | 99.00th=[  988], 99.50th=[ 1020], 99.90th=[ 1336], 99.95th=[ 2057],
     | 99.99th=[11338]
   bw (KiB/s): min=2000, max=68272, per=99.98%, avg=10370.55
   iops       : min=  500, max=17068, avg=2592.62

Run status group 0 (all jobs):
   READ: bw=10.1MiB/s, io=6078MiB, run=600001-600001msec

Disk stats (read/write):
  vdb: ios=1555778/0, merge=0/0, ticks=570518/0, util=95.04%
필드의미
io총 처리 데이터량 (MiB/GiB)
bw평균 대역폭
iops초당 입출력 연산 수
runt작업 실행 시간
slat커널에 요청 제출까지의 지연
clat커널에서 완료까지의 지연
lat전체 응답 시간 (slat + clat)
cpuCPU 사용률
IO depths동시 처리 중인 I/O 큐 깊이 분포

FIO 명령 옵션 상세

$ fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio \
  -bs=4096k -size=100G -numjobs=1 -runtime=300 \
  -group_reporting -filename=/dev/vdb -name=seq-read-test
주의: 원시 블록 장치(/dev/vdb 등) 직접 테스트는 파일 시스템 구조를 파괴합니다. 반드시 데이터 백업 후 진행하세요.
옵션설명
-direct=1페이지 캐시 우회, 직접 I/O 수행
-iodepth=128비동기 I/O 동시 요청 최대 개수
-rw=randwrite무작위 쓰기 (randread: 무작위 읽기, read: 순차 읽기, write: 순차 쓰기, randrw: 혼합)
-ioengine=libaioLinux 네이티브 비동기 I/O 엔진 사용
-bs=4k블록 크기 (IOPS 측정: 4k, 처리량 측정: 1024k 권장)
-size=1G테스트 대상 파일 크기
-numjobs=4병렬 작업자 스레드 수
-runtime=300테스트 지속 시간 (초), 미설정 시 -size까지 완료
-group_reporting개별 작업자가 아닌 전체 결과 집계 출력
-filename=/dev/vdb테스트 대상 경로 (파일 또는 블록 장치)
-name=test-run테스트 식별자 (임의 지정 가능)

실전 성능 측정 시나리오

시나리오 1: 4KB 무작위 쓰기 (IOPS 한계 측정)

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 \
  --rw=randwrite --time_based --runtime=300 --refill_buffers \
  --norandommap --randrepeat=0 --group_reporting \
  --name=rand-write-iops --size=1G --filename=/dev/vdb

측정 결과: 최대 IOPS 12,280 달성

시나리오 2: 4KB 무작위 읽기 (IOPS 한계 측정)

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 \
  --rw=randread --time_based --runtime=300 --refill_buffers \
  --norandommap --randrepeat=0 --group_reporting \
  --name=rand-read-iops --size=1G --filename=/dev/vdb

측정 결과: 최대 IOPS 23,310 달성

시나리오 3: 4MB 순차 쓰기 (처리량 한계 측정)

$ fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio \
  -bs=4096k -size=100G -numjobs=1 -runtime=300 \
  -group_reporting -filename=/dev/vdb -name=seq-write-bw

측정 결과: 최대 처리량 196 MB/s

시나리오 4: 4MB 순차 읽기 (처리량 한계 측정)

$ fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio \
  -bs=4096k -size=100G -numjobs=1 -runtime=300 \
  -group_reporting -filename=/dev/vdb -name=seq-read-bw

정 결과: 최대 처리량 466 MB/s 달성

워크로드별 최적 파라미터 가이드

애플리케이션 유형블록 크기I/O 패턴큐 깊이핵심 지표
OLTP 데이터베이스8KBrandrw32-64지연 시간 < 1ms
분석 데이터베이스1MBread64-128처리량 > 500MB/s
가상화 인프라4KBrandrw64-256IOPS > 10,000
미디어 스트리밍256KB-1MBread16-32처리량 안정성
빅데이터 처리128MBwrite64순차 쓰기 처리량

태그: FIO 블록스토리지 IOPS 스토리지벤치마킹 리눅스성능테스트

6월 1일 22:02에 게시됨