안녕하세요. 지구 IDC 기술팀입니다.
오늘은 Ubuntu 22.04에서 디스크 I/O 사용량이 높은 프로세스를 확인하는 방법을 알아보겠습니다. 서버 응답이 갑자기 느려지거나 데이터베이스·웹 서비스의 처리 시간이 길어졌을 때 CPU와 메모리 사용률은 높지 않은데 디스크가 계속 바쁘다면 어떤 프로세스가 실제로 읽기·쓰기를 발생시키는지 확인해야 합니다.
이 문서에서는 먼저 iostat으로 디스크 장치 자체가 병목인지 확인하고, iotop과 pidstat으로 I/O를 많이 발생시키는 프로세스를 찾은 뒤 PID와 실행 명령을 확인하는 순서로 설명합니다. 단순히 I/O 수치가 높다는 이유만으로 프로세스를 즉시 종료하지 않고, 해당 작업이 백업·데이터베이스 flush·로그 기록·swap 등 정상 작업인지 먼저 판별하는 것이 중요합니다.
적용 환경
| 항목 | 내용 |
|---|---|
| 운영체제 | Ubuntu 22.04 LTS |
| 주요 도구 | iostat, pidstat — sysstat 패키지 / iotop — iotop 패키지 |
| 필요 권한 | 패키지 설치 및 전체 프로세스 확인 시 sudo 권한 권장 |
디스크 I/O 문제를 확인하는 순서
iostat으로 실제 디스크 장치의 지연과 사용량을 확인합니다.iotop으로 현재 읽기·쓰기를 발생시키는 프로세스를 실시간으로 찾습니다.pidstat -d로 일정 시간 동안 프로세스별 읽기·쓰기 속도를 기록합니다.- 의심되는 PID의 실행 명령, 사용자와 서비스 정보를 확인합니다.
- swap, 로그 폭증, 백업, 데이터베이스 작업처럼 I/O가 발생한 실제 원인을 확인합니다.
- 원인을 확인한 뒤 서비스 설정 조정, 작업 시간 변경 또는 스토리지 성능 개선을 검토합니다.
I/O 확인 도구 설치
Ubuntu 22.04에서 iostat과 pidstat은 sysstat 패키지에 포함되어 있으며, iotop은 별도의 iotop 패키지로 설치할 수 있습니다.
sudo apt update
sudo apt install -y sysstat iotop
설치 후 각 명령이 정상적으로 실행되는지 확인합니다.
iostat -V
pidstat -V
iotop --version
iostat으로 디스크 장치가 실제로 바쁜지 확인
프로세스를 찾기 전에 먼저 블록 장치 자체에서 I/O 지연이 발생하고 있는지 확인합니다. 다음 명령은 1초 간격으로 확장 디스크 통계를 10회 출력하며, 활동이 없는 장치는 제외합니다.
iostat -xz 1 10
출력에서 특히 다음 값을 확인합니다.
| 항목 | 의미 | 확인 포인트 |
|---|---|---|
r/s, w/s |
초당 완료된 읽기·쓰기 요청 수 | 평소보다 요청 수가 급증했는지 확인 |
rkB/s, wkB/s |
초당 읽기·쓰기 데이터량 | 대용량 백업·로그·데이터 처리 여부 확인 |
await |
I/O 요청이 큐와 장치에서 처리되는 데 걸린 평균 시간 | 평상시 기준보다 지속적으로 증가하는지 확인 |
aqu-sz |
평균 I/O 요청 큐 길이 | 지연 증가와 함께 큐가 계속 쌓이는지 확인 |
%util |
장치에 I/O 요청이 존재했던 시간 비율 | 단독 수치보다 await, 큐 길이와 함께 해석 |
iotop으로 높은 I/O 프로세스 실시간 확인
iotop은 실행 중인 프로세스 또는 스레드별 디스크 읽기·쓰기 속도와 I/O 대기 정보를 실시간으로 보여줍니다. 관리자 권한으로 실행합니다.
sudo iotop
현재 실제 I/O가 발생하는 항목만 보고 싶다면 -o, 개별 스레드가 아니라 프로세스 단위로 묶어 보려면 -P를 사용합니다.
sudo iotop -oP
짧은 순간이 아니라 관찰을 시작한 이후 누적된 I/O 양을 비교하려면 -a를 추가합니다.
sudo iotop -oPa
대화형 화면을 계속 보고 있을 수 없는 경우에는 batch 모드로 일정 횟수만 수집할 수 있습니다. 다음 예시는 1초 간격으로 10회 측정합니다.
sudo iotop -boP -d 1 -n 10
간헐적으로 발생하는 문제라면 한 번의 출력보다 여러 번 측정한 결과에서 반복적으로 상위에 나타나는 프로세스를 확인하는 것이 좋습니다.
pidstat으로 프로세스별 I/O 측정
pidstat은 프로세스별 통계를 일정한 간격으로 출력하므로 기록을 남기거나 여러 시점의 값을 비교할 때 유용합니다. -d 옵션은 I/O 통계를 표시합니다.
pidstat -d 1 10
주요 출력 항목은 kB_rd/s, kB_wr/s, kB_ccwr/s, iodelay, PID, Command입니다. 특정 PID만 관찰하려면 아래처럼 지정합니다. 1234는 실제 PID로 변경하십시오.
pidstat -d -p 1234 1 10
의심되는 프로세스 상세 확인
I/O가 높은 PID를 찾았다면 실제 실행 명령과 부모 프로세스, 실행 사용자부터 확인합니다.
ps -p 1234 -o pid,ppid,user,stat,etime,cmd
sudo readlink -f /proc/1234/exe
sudo cat /proc/1234/io
/proc/PID/io의 값은 특정 순간의 초당 속도가 아니라 프로세스 실행 중 누적된 I/O 관련 카운터입니다. 순간적인 부하 비교에는 iotop이나 pidstat을 사용하십시오.
swap과 메모리 압박으로 인한 I/O 확인
특정 애플리케이션이 대량 파일 작업을 하지 않는데도 디스크 I/O와 시스템 지연이 지속된다면 메모리 부족으로 swap I/O가 발생하는지 확인합니다.
free -h
swapon --show
vmstat 1 10
vmstat의 si와 so가 지속적으로 발생하면서 I/O 대기와 서비스 지연이 함께 나타난다면 메모리 압박에 따른 swap 사용을 의심할 수 있습니다.
ps aux --sort=-%mem | head -n 15
상황별 원인과 해결 방향
| 관찰 결과 | 가능한 원인 | 확인 방법 | 해결 방향 |
|---|---|---|---|
iotop에서 특정 프로세스 쓰기가 지속적으로 높음 |
로그 폭증, DB flush, 백업, 파일 변환 | PID, 서비스 로그, 작업 스케줄 | 원인 작업의 주기·동시성·로그 정책 조정 |
await와 큐가 지속적으로 증가 |
스토리지 처리량 부족 또는 지연 | iostat -xz, 호스트·스토리지 상태 |
I/O 감소, 작업 분산, 스토리지 성능 검토 |
| 짧은 시간만 I/O 급증 | Cron, systemd timer, 백업, 로그 회전 | pidstat 반복 측정, 작업 스케줄 |
피크 시간 분산 또는 동시 실행 조정 |
vmstat의 si/so가 지속 발생 |
메모리 부족으로 인한 swap I/O | free -h, 메모리 상위 프로세스 |
메모리 사용 원인 수정, RAM·애플리케이션 설정 검토 |
iotop에 원인 프로세스가 잘 보이지 않음 |
짧은 작업, 커널 I/O, 가상화 계층 영향 | pidstat, iostat, 반복 수집 |
수집 시간을 늘리고 호스트·스토리지 계층 점검 |
가상서버에서는 게스트 프로세스가 원인이 아닐 수도 있습니다
VPS나 가상머신에서는 게스트 OS의 iotop에서 높은 I/O를 발생시키는 프로세스가 보이지 않는데도 디스크 지연이 발생할 수 있습니다. 호스트 스토리지 혼잡이나 공유 스토리지 지연은 게스트 안의 프로세스 통계만으로 완전히 설명되지 않을 수 있으므로 iostat 결과와 문제 발생 시간을 함께 기록해 두는 것이 좋습니다.
조치 후 디스크 I/O 다시 확인
원인 프로세스의 작업 주기를 조정하거나 애플리케이션 설정을 변경했다면 같은 조건에서 다시 측정해 개선 여부를 확인합니다.
iostat -xz 1 10
pidstat -d 1 10
sudo iotop -oP
조치 전후의 await, 큐 길이, 프로세스별 읽기·쓰기 속도와 실제 서비스 응답 시간을 함께 비교해야 효과를 정확히 판단할 수 있습니다.
관련 지구 IDC 기술자료
공식 참고자료
| 기관 | 문서 | 확인 내용 | 조회일 |
|---|---|---|---|
| Ubuntu Manpages | iotop(8) — Ubuntu 22.04 | 프로세스별 I/O, -o, -P, -a, batch 옵션 |
|
| Ubuntu Manpages | iostat(1) — Ubuntu 22.04 | 장치별 I/O 통계, 지연, 큐와 %util 해석 |
|
| Ubuntu Packages | sysstat package — Jammy | Ubuntu 22.04의 sysstat 패키지 제공 여부 | |
| Ubuntu Packages | iotop package — Jammy | Ubuntu 22.04의 iotop 패키지 제공 여부 |
|
| Ubuntu Project | List of releases | Ubuntu 22.04 LTS 지원 상태 |
자주 묻는 질문
iotop과 iostat의 차이는 무엇인가요?
iostat은 디스크·블록 장치 전체의 처리량, 지연, 큐와 사용 상태를 확인하는 도구이고 iotop은 그 I/O를 발생시키는 프로세스나 스레드를 찾는 데 적합합니다.
%util이 100%이면 디스크가 무조건 포화 상태인가요?
아닙니다. RAID와 현대적인 SSD처럼 병렬 요청을 처리할 수 있는 스토리지에서는 %util만으로 처리 한계를 단정할 수 없습니다. await, 큐 길이와 실제 응답 시간을 함께 확인해야 합니다.
I/O가 높은 프로세스를 바로 종료해도 되나요?
권장하지 않습니다. 먼저 PID의 실행 명령과 서비스, 로그를 확인하고 해당 I/O가 정상적인 백업·데이터베이스 작업인지 판별해야 합니다. 종료가 필요한 경우에도 애플리케이션 또는 systemd의 정상 종료 절차를 우선 사용하십시오.
sysstat 서비스를 활성화해야 pidstat과 iostat을 사용할 수 있나요?
현재 상태를 실시간 측정하는 pidstat과 iostat은 패키지만 설치하면 사용할 수 있습니다. 과거 시간대의 성능 기록을 지속적으로 저장하려는 경우에는 sysstat 수집 기능을 별도로 구성합니다.
마무리
오늘은 Ubuntu 22.04에서 디스크 I/O 사용량이 높은 프로세스를 확인하는 방법을 살펴봤습니다. 먼저 iostat -xz으로 실제 장치 지연을 확인하고, iotop과 pidstat -d로 읽기·쓰기를 많이 발생시키는 PID를 찾으면 원인을 빠르게 좁힐 수 있습니다.
디스크 I/O 문제는 단순한 프로세스 과부하뿐 아니라 swap, 백업 작업, 로그 폭증, 데이터베이스 flush, 가상화 스토리지 지연 등 다양한 원인으로 발생할 수 있습니다. 프로세스를 강제로 종료하기 전에 서비스 역할과 작업 내용을 반드시 확인하시기 바랍니다.
오늘 준비한 내용은 여기까지입니다. 다음에도 서버 운영에 도움이 되는 기술정보로 인사드리겠습니다.
中文
English
한국어