블록 스토리지 핵심 성능 지표
클라우드 환경에서 블록 스토리지의 성능을 평가할 때는 다음 세 가지 핵심 메트릭을 중심으로 분석합니다.
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) |
| cpu | CPU 사용률 |
| 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=libaio | Linux 네이티브 비동기 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 데이터베이스 | 8KB | randrw | 32-64 | 지연 시간 < 1ms |
| 분석 데이터베이스 | 1MB | read | 64-128 | 처리량 > 500MB/s |
| 가상화 인프라 | 4KB | randrw | 64-256 | IOPS > 10,000 |
| 미디어 스트리밍 | 256KB-1MB | read | 16-32 | 처리량 안정성 |
| 빅데이터 처리 | 128MB | write | 64 | 순차 쓰기 처리량 |