top을 띄웠더니 us·sy는 낮은데 wa(iowait)만 40%를 넘고 있습니다. CPU는 한가한데 시스템 전체가 끈적하게 느립니다. iowait는 "CPU가 할 일은 없는데 디스크 I/O가 끝나길 기다리는 시간"입니다. 즉 CPU가 아니라 디스크가 병목입니다.
1단계 — iowait가 정말 높은가 (top)
로컬 터미널
top
# %Cpu(s): 3.1 us, 1.2 sy, 0.0 ni, 52.0 id, 43.5 wa
wa가 지속적으로 높으면(보통 10% 이상이 계속 유지되면) 디스크 대기가 부하의 핵심입니다. 일시적 스파이크가 아니라 지속 여부가 중요합니다.
2단계 — 어느 디스크가 느린가 (iostat)
로컬 터미널
iostat -x 1 5
핵심 열은 await(요청당 평균 대기 시간, ms)와 %util(장치 포화도)입니다.
| 열 | 의미 | 경고 신호 |
|---|---|---|
await | I/O 요청 1건의 평균 소요(ms) | 수십 ms 이상 지속 |
r_await / w_await | 읽기/쓰기 각각의 대기 | 한쪽만 크면 패턴 단서 |
%util | 장치가 바쁜 시간 비율 | 100%에 붙으면 포화 |
aqu-sz | 평균 큐 길이 | > 1 이면 요청이 쌓임 |
%util이 100%에 가깝고 await가 크면 그 장치가 포화 상태입니다.
3단계 — 어떤 프로세스가 디스크를 쓰나 (iotop)
로컬 터미널
sudo iotop -oP
-o는 실제 I/O 중인 것만, -P는 프로세스 단위로 보여줍니다. DISK READ·DISK WRITE 상위 프로세스가 범인입니다. 흔한 경우: 로그 폭증, 백업·덤프 잡, swap 발생, DB 체크포인트.
swap이 의심되면 함께 확인합니다.
로컬 터미널
vmstat 1 5
# si·so 열이 0이 아니면 스왑 입출력 중
체크리스트
로컬 터미널
top # wa 지속 여부
iostat -x 1 5 # await 큰 장치 + %util 포화
iotop -oP # I/O 유발 프로세스
vmstat 1 5 # si/so 로 스왑 동반 여부
await가 큰 장치를 특정하고 그 위에서 가장 많이 읽고 쓰는 프로세스를 잡으면, "막연히 느리다"가 "이 잡이 이 디스크를 포화시킨다"로 좁혀집니다.
iostat·iotop·vmstat로 I/O 병목을 직접 끊어보는 실습과 성능 진단 감각은 리눅스 트랙에서 회원가입 없이 무료로 익힐 수 있습니다.