Linux 디스크 I/O 성능 분석
서버 성능 문제의 상당수는 디스크 I/O 병목에서 발생합니다. 정확한 원인을 파악하려면 적절한 도구로 체계적으로 분석해야 합니다.
iostat으로 기본 분석
# iostat 설치
sudo apt install sysstat
# 기본 사용: 2초 간격, 5회 측정
iostat -xz 2 5
# 출력 예시
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %util await r_await w_await
sda 45.2 120.5 1804.8 4820.0 0.8 25.3 78.5 4.2 2.1 5.8
nvme0n1 230.1 85.3 9204.0 3412.0 0.0 0.0 35.2 0.8 0.5 1.2
# 핵심 지표 해석
# %util : 디스크 사용률 (90% 이상이면 포화)
# await : 평균 I/O 응답 시간 (ms)
# r/s, w/s: 초당 읽기/쓰기 요청 수
iotop으로 프로세스별 I/O 확인
sudo apt install iotop
sudo iotop -oP
# Total: 45.23 M/s Actual: 52.10 M/s
# TID PRIO USER DISK READ DISK WRITE COMMAND
# 1523 be/4 postgres 12.50 M/s 3.20 M/s postgres: autovacuum
# 2847 be/4 mysql 0.00 B/s 28.50 M/s mysqld --datadir
# 3291 be/4 root 5.10 M/s 0.00 B/s rsync --archive
fio로 벤치마크 테스트
# fio 설치
sudo apt install fio
# 순차 읽기 테스트
fio --name=seq-read --ioengine=libaio --direct=1 \
--rw=read --bs=1M --size=1G --numjobs=4 \
--runtime=60 --group_reporting --filename=/tmp/fio-test
# 랜덤 읽기/쓰기 테스트 (DB 워크로드)
fio --name=random-rw --ioengine=libaio --direct=1 \
--rw=randrw --rwmixread=70 --bs=4k --size=1G \
--numjobs=8 --iodepth=32 --runtime=60 \
--group_reporting --filename=/tmp/fio-test
fio 설정 파일
# db-workload.fio
[global]
ioengine=libaio
direct=1
size=2G
runtime=120
time_based
group_reporting
[random-read]
rw=randread
bs=8k
numjobs=4
iodepth=16
filename=/data/fio-test
[sequential-write]
rw=write
bs=64k
numjobs=2
iodepth=8
filename=/data/fio-test-seq
blktrace로 상세 추적
# blktrace 설치
sudo apt install blktrace
# 추적 시작 (10초)
sudo blktrace -d /dev/sda -o trace -w 10
# 분석
blkparse -i trace.blktrace.0 | head -50
# btt로 통계 분석
btt -i trace.blktrace.0
I/O 스케줄러 튜닝
# 현재 스케줄러 확인
cat /sys/block/sda/queue/scheduler
# SSD에 적합한 스케줄러
echo "none" | sudo tee /sys/block/nvme0n1/queue/scheduler
# HDD에 적합한 스케줄러
echo "mq-deadline" | sudo tee /sys/block/sda/queue/scheduler
# readahead 설정
sudo blockdev --setra 4096 /dev/sda
디스크 유형별 기대 성능
| 지표 | HDD (7200rpm) | SATA SSD | NVMe SSD |
|---|---|---|---|
| 순차 읽기 | 150 MB/s | 550 MB/s | 3500 MB/s |
| 순차 쓰기 | 150 MB/s | 520 MB/s | 3000 MB/s |
| 랜덤 IOPS (4K) | 100-200 | 50K-90K | 500K-1M |
| 레이턴시 | 5-10ms | 0.1-0.5ms | 0.02-0.05ms |
%util이 지속적으로 90% 이상이면 디스크 포화 상태await이 급격히 증가하면 I/O 큐잉 지연 발생- SSD에서는 TRIM이 활성화되어 있는지 확인 (
fstrim -v /) - 데이터베이스 서버는
fio로 실제 워크로드를 시뮬레이션하여 테스트
댓글 0