우분투 실전 명령어 | top, htop, vmstat, iostat로 병목 찾기
언제 쓰는가
서버가 갑자기 느려졌는데 원인이 CPU인지 메모리인지 디스크인지 감이 안 올 때 바로 쓰는 조합이다. top 하나만 보면 순간 상태는 보이지만 병목 지점을 놓치기 쉽다. top, vmstat, iostat를 같이 보면 프로세스 과부하와 I/O 대기를 빠르게 분리해서 볼 수 있다.
바로 쓰는 명령어
# 1) 전체 상태를 1초 간격으로 확인
top -d 1
# 2) CPU 많이 쓰는 프로세스 상위 15개
ps -eo pid,ppid,user,%cpu,%mem,stat,etime,cmd --sort=-%cpu | head -n 16
# 3) 메모리/스왑/런큐를 1초 간격 5회 확인
vmstat 1 5
# 4) 디스크 I/O 병목 확인(확장 통계)
iostat -xz 1 5
# htop이 있으면 트리 보기 + CPU 정렬이 더 편하다
htop
# iostat가 없으면 sysstat 설치
sudo apt update && sudo apt install -y sysstat
핵심 옵션/패턴
- top -d 1: 1초 주기로 갱신한다. 반응이 빠른 대신 원격 접속 환경에서는 트래픽이 조금 늘 수 있다.
- ps --sort=-%cpu: CPU 사용률 내림차순으로 정렬해서 과부하 프로세스를 바로 찾는다.
- vmstat 1 5: 첫 줄은 부팅 이후 평균이라 참고용이고, 그다음 줄부터 현재 추세를 본다.
- iostat -xz 1 5: await가 높고 util이 90% 이상이면 디스크 대기 병목 가능성이 크다.
명령 출력 예시
$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 412000 53000 890000 0 0 2 4 210 330 6 2 91 1 0
3 1 0 398000 53000 892000 0 0 24 420 980 1700 35 10 40 15 0
$ iostat -xz 1 3
Device r/s w/s rkB/s wkB/s await %util
nvme0n1 120.0 85.0 5400.0 3200.0 18.5 92.1
자주 하는 실수
- top 한 화면만 보고 결론 내리는 경우가 많다. 최소 30초 이상 보면서 추세를 확인해야 한다.
- vmstat 첫 번째 줄을 현재 상태로 오해하기 쉽다. 첫 줄은 평균값이라 진단 기준에서 분리해서 봐야 한다.
- iostat에서 %util만 보고 디스크 병목이라고 단정하는 경우가 있다. await, r/s, w/s를 같이 확인해야 정확하다.
- 컨테이너 환경에서 호스트 지표와 컨테이너 지표를 섞어 해석하면 원인을 놓칠 수 있다.
검증 방법 (결과 확인 명령어)
# CPU 상위 프로세스 재확인
ps -eo pid,%cpu,%mem,cmd --sort=-%cpu | head -n 10
# 메모리 압박 확인
free -h
# 디스크 대기 재확인
iostat -xz 1 3
운영 팁 (선택)
초기 대응에서는 1초 간격으로 짧게 관찰하고, 원인 후보를 좁힌 뒤에는 5초 간격으로 길게 본다. 그래야 순간 스파이크와 지속 병목을 구분하기 쉽다. 장애 회고용으로는 vmstat, iostat 출력 1분치만 저장해도 재현 없는 이슈 분석에 큰 도움이 된다.
출처
- Ubuntu Manpage
- Red Hat Performance Tuning Guide
- Brendan Gregg Systems Performance