리눅스 I/O Wait 높을 때 원인 파악하는 방법
리눅스 서버에서 전체 성능 저하가 발생할 때 가장 먼저 확인해야 하는 지표 중 하나가 I/O Wait(iowait) 값이다. iowait은 CPU가 작업을 수행하지 못하고 디스크 I/O 완료를 기다리는 시간 비율을 의미한다. 즉, CPU는 할 일이 있지만 디스크가 데이터를 제때 제공하지 못해 “대기 상태”에 머무르는 것이다. 이 값이 높아지면 시스템 반응 속도가 급격하게 떨어지며, 웹서버·DB·배치 작업 모두 영향을 받는다. 본 글에서는 iowait이 높아지는 원인과 문제를 정확하게 진단하는 방법을 심층적으로 정리한다.
1. I/O Wait의 기본 개념
CPU는 작업을 처리하려면 데이터를 메모리 또는 디스크에서 가져와야 한다.
디스크 I/O 속도가 느려지면 CPU는 작업 결과를 기다리며 대기 상태에 머무르게 되고, 이를 iowait으로 측정한다.
대표적인 확인 명령어는 다음과 같다.
top
vmstat 1
iostat -x 1
iowait이 20~30% 이상이면 시스템 병목 가능성이 높으며, 특정 서버에서는 5~10%만 되어도 체감 성능 저하가 발생할 수 있다.
2. I/O Wait 증가의 주요 원인
1) 디스크 성능 저하
HDD 환경에서는 회전 지연(rotational latency)로 인해 iowait 증가가 자주 발생한다.
SSD에서도 다음 상황에서는 성능 저하가 발생할 수 있다.
- SSD 수명 저하
- 과도한 쓰기 작업
- 큐 깊이 증가
- 스토리지 컨트롤러 병목
iostat의 await, svctm, util 값을 통해 디스크 상태를 분석할 수 있다.
2) 과도한 랜덤 I/O
데이터베이스, 로그 파일, 캐시 작업 등이 동시에 일어나면 랜덤 I/O 폭증으로 iowait이 상승한다.
예:
- InnoDB flush
- Elasticsearch 인덱싱
- journald 로그 과다 생성
3) 메모리 부족에 따른 스왑 사용
RAM이 부족하면 시스템은 디스크를 스왑 공간으로 사용한다.
스왑 작업은 디스크 기반이므로 속도가 매우 느려 iowait 증가로 이어진다.
확인 명령어:
free -h
vmstat 1
4) 파일 시스템 문제
특정 파일 시스템은 대량 I/O 작업에서 잠금(lock) 문제가 발생할 수 있다.
예:
- ext4의 fsync 병목
- XFS의 메타데이터 잠금
- NFS 지연
5) 네트워크 스토리지 문제
NAS, SAN, NFS 기반 스토리지는 네트워크 지연까지 추가되므로 iowait 상승이 더 쉽게 발생한다.
원인:
- 네트워크 지연
- 스토리지 장비 과부하
- 패킷 손실
6) CPU 스케줄러 문제
CPU가 과도하게 다른 작업에 집중돼 디스크 요청 처리가 늦어질 수도 있다.
확인 명령어:
pidstat -d 1
특정 프로세스가 I/O 큐를 과도하게 점유하는 경우 발견 가능하다.
3. iowait 원인 파악을 위한 핵심 체크리스트
1) I/O 사용량 분석
iostat -x 1
중점 확인 항목:
util80% 이상 → 디스크 과부하await길어짐 → 지연 증가r/s,w/s증가 → 특정 프로세스 과다 I/O
2) 프로세스별 I/O 확인
iotop
pidstat -d 1
특정 프로세스가 과도하게 읽기·쓰기 작업을 수행하는지 확인한다.
3) 파일 시스템 지연 확인
dmesg | grep -i error
메타데이터 문제, I/O 오류 등의 로그를 확인한다.
4) 스왑 발생 여부 확인
swapon --show
free -h
vmstat 1
swap in/out 비율이 높으면 메모리 증설 또는 스왑 최소화 조정이 필요하다.
5) 스토리지 장비 상태 확인
가상화 환경이라면 하이퍼바이저 단에서 디스크 병목이 발생할 수도 있다.
클라우드 환경에서는 IOPS 제한이나 Burst 제한도 원인이 될 수 있다.
6) 네트워크 스토리지 병목 확인
nfsstat
iostat -x
ping
traceroute
지연 문제인지 장비 문제인지 구분해야 한다.
4. I/O Wait 해결 방법
1) 빠른 스토리지로 교체
HDD → SSD, 또는 SATA SSD → NVMe SSD로 변경하면 즉각적인 개선 효과가 있다.
2) 메모리 증설
스왑 사용량을 줄이면 iowait이 크게 감소한다.
3) DB 튜닝
DB가 iowait의 원인인 경우 다음을 점검해야 한다.
- 적절한 인덱싱
- 불필요한 FULL SCAN 제거
- 커넥션 풀 최적화
- InnoDB Buffer Pool 설정 확대
4) 로그 파일 관리
로그 폭증은 I/O 병목을 유발한다.
조치 예:
- journald rate-limit
- nginx logrotate
- ElasticSearch 인덱스 관리
5) 캐시 활용
Redis·Memcached 같은 메모리 기반 캐시로 디스크 I/O 의존도를 줄인다.
6) RAID 및 스토리지 구조 개선
- RAID 10 구성
- NVMe 기반 스토리지로 이전
- 스토리지 컨트롤러 최적화
7) NFS·NAS 지연 해결
- 네트워크 대역폭 증가
- Jumbo Frame 설정
- NFS mount 옵션 개선
전문가 견해 기반 결말
I/O Wait은 단순히 디스크 속도만의 문제가 아니라, 운영체제 자원 관리, 파일 시스템 구조, DB 처리 방식, 스토리지 장비 특성까지 복합적으로 영향을 받는 지표다. 실제 서버 환경에서 iowait이 높아진다면 단일 원인보다 여러 병목이 동시에 발생하는 경우가 많기 때문에, 프로세스 단위·파일 시스템 단위·스토리지 단위로 단계적으로 분석하는 접근이 필수적이다. I/O Wait 문제를 정확히 진단하고 해결하는 과정은 시스템 안정성을 좌우하는 핵심 요소이며, 이는 서버 운영자의 역량을 가장 명확하게 보여주는 영역이라 할 수 있다.