/엔지니어/트러블슈팅/I/O 병목 진단 — iostat · iotop ·
트러블슈팅중급UbuntuDebianCentOSiostatiotopio

I/O 병목 진단 — iostat · iotop · blktrace

iostat으로 디스크 I/O 사용률을 파악하고, iotop으로 I/O 과부하 프로세스를 찾으며, blktrace와 fio로 스토리지 성능을 측정하는 방법을 설명합니다.

I/O 병목 증상

  • CPU가 낮은데 서버가 느림
  • vmstat에서 wa(wait) 지속적으로 높음
  • 응답 시간이 불규칙하게 급증

1단계 — vmstat으로 wa 확인

Bash
vmstat 2 10
# procs  ----------memory---------- --swap-- -----io---- -system-- ------cpu-----
#  r  b   swpd   free   buff  cache   si  so    bi    bo   in   cs us sy id wa st
#  1  3      0  512M    20M   1.5G    0   0   8000  4000  500 1000  5  2  3 90  0
#                                                             ↑↑↑↑
# wa=90: CPU가 I/O 완료를 기다리는 중 — 명백한 I/O 병목

2단계 — iostat으로 디스크 상태 분석

Bash
sudo apt install -y sysstat

# 2초 간격, 5회
iostat -xz 2 5

# 주요 컬럼 해석
# %util: 디스크 사용률 (100%에 가까우면 포화)
# await: 평균 I/O 응답 시간 (ms) — 일반 HDD: <20ms, SSD: <1ms
# r/s, w/s: 초당 읽기/쓰기 요청 수
# rkB/s, wkB/s: 초당 읽기/쓰기 처리량 (KB)
# svctm: 서비스 시간 (await - 큐 대기시간)

# 특정 디바이스만
iostat -x sda sdb 2

# 디스크별 읽기/쓰기 비율
iostat -d -k 2 | grep -v "^$"

3단계 — iotop으로 원인 프로세스 찾기

Bash
sudo apt install -y iotop

# 인터랙티브 모드
sudo iotop

# I/O 사용 중인 프로세스만 표시 (-o)
sudo iotop -o

# 1회 스냅샷
sudo iotop -b -n 3 | head -20

# 단축키
# o: 활성 프로세스만 토글
# p: 프로세스/스레드 전환
# a: 누적 I/O 토글

4단계 — 프로세스별 I/O 상세 (pidstat)

Bash
# 특정 프로세스 I/O 추적
pidstat -d -p 1234 2 5

# 모든 프로세스 I/O
pidstat -d 2 5 | sort -k4 -rn | head -10

# 열린 파일 확인 (어떤 파일에 I/O 중인지)
sudo lsof -p 1234 | grep -E "REG|DIR"
sudo ls -la /proc/1234/fd

5단계 — fio로 디스크 성능 측정

Bash
sudo apt install -y fio

# 순차 읽기 성능
fio --name=seq-read --ioengine=libaio --iodepth=32   --rw=read --bs=128k --direct=1 --size=1G   --numjobs=1 --runtime=30 --filename=/tmp/fio-test

# 랜덤 읽기/쓰기 (IOPS 측정 — SSD 성능 지표)
fio --name=rand-rw --ioengine=libaio --iodepth=32   --rw=randrw --bs=4k --direct=1 --size=1G   --numjobs=4 --runtime=30 --filename=/tmp/fio-test   --group_reporting

# 결과 해석
# READ: IOPS=50k, BW=200MiB/s (SSD 정상)
# IOPS<1000 이면 HDD 수준

6단계 — 해결 방법

Bash
# DB 쓰기 부하 → 버퍼 풀 증가
# PostgreSQL: shared_buffers = 총 메모리의 25%
# MySQL: innodb_buffer_pool_size = 총 메모리의 50-70%

# 로그 I/O 많음 → 비동기 커밋
# PostgreSQL: synchronous_commit = off (데이터 손실 위험 있음)

# 디스크 캐시 확인
free -h
# buff/cache 많으면 OS가 캐시 활용 중 — 정상

# I/O 스케줄러 변경 (SSD에는 none 또는 mq-deadline)
cat /sys/block/sda/queue/scheduler
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler
#iostat#iotop#io#디스크#성능#트러블슈팅
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.