본문 바로가기
Infra2026년 1월 28일5분 읽기

Linux 디스크 I/O 성능 분석 — iostat fio blktrace

YS
김영삼
조회 389

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 SSDNVMe SSD
순차 읽기150 MB/s550 MB/s3500 MB/s
순차 쓰기150 MB/s520 MB/s3000 MB/s
랜덤 IOPS (4K)100-20050K-90K500K-1M
레이턴시5-10ms0.1-0.5ms0.02-0.05ms
  • %util이 지속적으로 90% 이상이면 디스크 포화 상태
  • await이 급격히 증가하면 I/O 큐잉 지연 발생
  • SSD에서는 TRIM이 활성화되어 있는지 확인 (fstrim -v /)
  • 데이터베이스 서버는 fio로 실제 워크로드를 시뮬레이션하여 테스트

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록