리눅스에서 CPU 사용률이 높은 프로세스 찾는 실전 방법
서버 운영 중 CPU 사용률이 급격히 상승하면 응답 지연이 발생하고 서비스가 마비될 수 있습니다. 리눅스에서는 다양한 명령어와 도구로 CPU를 점유하는 프로세스를 신속하게 식별하고 원인을 분석할 수 있습니다. 이번 글에서는 실무에서 바로 활용할 수 있는 CPU 모니터링과 분석 방법을 상세히 정리해 드리겠습니다.
기본 모니터링 명령어
🔍 top 명령어
가장 기본적인 실시간 프로세스 모니터링 도구입니다. CPU 사용률이 높은 프로세스를 실시간으로 확인할 수 있습니다.
$ top
top - 14:32:01 up 15 days, 3:21, 2 users, load average: 2.45, 1.89, 1.23
Tasks: 234 total, 1 running, 233 sleeping, 0 stopped, 0 zombie
%Cpu(s): 75.2 us, 15.3 sy, 0.0 ni, 9.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4521 www-data 20 0 892340 234512 12340 R 98.7 2.3 0:45.32 node server.js
1234 mysql 20 0 4523412 890123 45670 S 45.2 8.9 12:34.56 mysqld
890 redis 20 0 234560 45678 8900 S 3.4 0.4 2:10.15 redis-server
주요 지표:
- %Cpu(s): 사용자 공간(us), 커널 공간(sy), 유휴(id) 비율
- load average: 1분, 5분, 15분 평균 부하 (CPU 코어 수 대비)
- %CPU: 개별 프로세스의 CPU 사용률
🔍 htop (향상된 top)
컬러 기반 인터페이스와 마우스 지원으로 가독성이 뛰어난 프로세스 뷰어입니다.
# 설치
sudo apt install htop
# 실행
htop
# 주요 단축키
F4: 필터 (프로세스명 검색)
F5: 트리 뷰 (부모-자식 관계)
F6: 정렬 기준 변경 (CPU, 메모리, PID 등)
F9: 프로세스 종료 (kill)
🔍 ps 명령어
스냅샷 형태로 프로세스 정보를 출력합니다. 스크립트나 파이프라인에서 활용하기 좋습니다.
# CPU 사용률 기준 상위 10개 프로세스
ps aux --sort=-%cpu | head -n 11
# 특정 사용자의 프로세스만
ps -u www-data -o pid,ppid,cmd,%cpu,%mem --sort=-%cpu
# 스레드 단위 확인
ps -eLf | grep node
심화 분석 도구
🔧 pidstat (sysstat 패키지)
특정 프로세스의 CPU, 메모리, I/O 사용량을 시간대별로 추적할 수 있습니다.
# 설치
sudo apt install sysstat
# 1초 간격으로 5회 측정
pidstat -u -p 4521 1 5
# 모든 프로세스의 CPU 사용량
pidstat -u 1
# 스레드 단위 CPU 사용량
pidstat -u -t -p 4521 1
🔧 perf (Linux Performance Counter)
CPU 수준의 하드웨어 이벤트를 분석하여 병목의 근본 원인을 찾습니다.
# CPU 사이클 분석
sudo perf top -p 4521
# 함수 호출 스택 샘플링
sudo perf record -g -p 4521
sudo perf report
# 특정 시간 동안 프로파일링
sudo perf stat -p 4521 sleep 10
🔧 strace (시스템 호출 추적)
프로세스가 어떤 시스템 호출을 수행하는지 추적합니다. I/O 병목이나 무한 루프를 찾을 때 유용합니다.
# 실시간 시스템 호출 추적
sudo strace -cp 4521
# 파일 I/O 추적
sudo strace -e trace=open,read,write -p 4521
# 네트워크 호출 추적
sudo strace -e trace=network -p 4521
CPU 부하 유형별 진단
| 유형 | 특징 | 진단 방법 | 해결 방향 |
|---|---|---|---|
| 사용자 CPU (us) | 애플리케이션 코드 실행 | perf, 프로파일러 | 코드 최적화, 알고리즘 개선 |
| 시스템 CPU (sy) | 커널 모드 실행 (I/O, 스케줄링) | strace, iostat | 시스템 호출 감소, I/O 최적화 |
| I/O 대기 (wa) | 디스크 I/O 대기 | iostat, iotop | 디스크 업그레이드, 캐싱 |
| 스틸 (st) | 가상화 환경에서의 CPU 절유 | hypervisor 모니터링 | 인스턴스 업그레이드, noisy neighbor 확인 |
| 부하 평균 높음 / CPU 낮음 | 대기 중인 프로세스 많음 | vmstat, 프로세스 상태 | 메모리 부족, 락 경쟁 확인 |
실전 분석 시나리오
🚨 시나리오 1: Node.js 서버 CPU 100%
# 1. 프로세스 확인
top -p $(pgrep -d',' node)
# 2. 이벤트 루프 블로킹 확인
node --prof server.js
node --prof-process isolate-*.log > profile.txt
# 3. V8 프로파일러
0x -o profile.html -- node server.js
# 4. 해결: CPU 집약 작업을 Worker Threads로 분리
const { Worker } = require('worker_threads');
const worker = new Worker('./heavy-task.js');
🚨 시나리오 2: MySQL CPU 급증
# 1. 느린 쿼리 확인
SHOW FULL PROCESSLIST;
SELECT * FROM performance_schema.threads WHERE NAME LIKE '%sql%';
# 2. 실행 계획 분석
EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'pending';
# 3. 잠금 대기 확인
SHOW ENGINE INNODB STATUS;
# 4. 해결: 인덱스 추가, 쿼리 재작성, connection pool 조정
자동화 및 모니터링
# CPU 알림 스크립트 (cron에 등록)
#!/bin/bash
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
THRESHOLD=80
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
TOP_PROCESS=$(ps aux --sort=-%cpu | head -n 2 | tail -n 1)
echo "High CPU Alert: $CPU_USAGE% | $TOP_PROCESS" | \
mail -s "CPU Alert $(hostname)" admin@example.com
fi
# Prometheus + Node Exporter로 지속적 모니터링
# Grafana 대시보드에서 CPU 사용률 시각화
실무 체크리스트
- ✅ top/htop로 빠르게 이상 프로세스 식별
- ✅ load average를 CPU 코어 수와 비교 (코어 수 초과 시 부하)
- ✅ pidstat로 프로세스별 시간대별 추적
- ✅ perf로 CPU 사이클 단위 분석
- ✅ strace로 시스템 호출 병목 확인
- ✅ us vs sy vs wa 비율로 부하 유형 판별
- ✅ Prometheus/Grafana로 지속적 모니터링 구축
- ✅ 알림 설정으로 사전 대응 체계 마련
자주 묻는 질문
CPU 100%인데 프로세스를 죽여도 안 내려가요
좀비 프로세스나 커널 스레드일 수 있습니다. ps aux | grep Z로 좀비 프로세스를 확인하고, reboot가 아닌 kill -9로 강제 종료해보세요. 커널 수준 문제라면 시스템 재시작이 필요할 수 있습니다.
load average는 높은데 CPU 사용률은 낮아요
이는 I/O 병목이나 락 경쟁을 의미합니다. vmstat 1에서 r(실행 대기열)과 b(블록 대기) 컬럼을 확인하세요. b가 높으면 I/O, r이 높으면 CPU 부족 또는 락 경쟁입니다.
컨테이너 환경에서도 동일한가요?
기본 명령어는 동일하게 사용 가능하지만, 호스트의 전체 CPU를 볼 수 없는 경우가 있습니다. docker stats 또는 kubectl top pod로 컨테이너 단위 리소스를 확인하세요. cgroups 기준으로 제한된 CPU 사용률이 표시됩니다.
마무리
이번 글에서는 리눅스에서 CPU 사용률이 높은 프로세스 찾는 실전 방법을 정리해 드렸습니다. CPU 문제는 신속한 진단이 서비스 안정성을 좌우합니다.
핵심을 정리하면 다음과 같습니다: top/htop으로 빠르게 식별하고, pidstat으로 추적하고, perf로 근본 원인을 분석하며, strace로 시스템 호출을 확인하고, 모니터링으로 사전에 대응하세요.
리눅스 CPU 모니터링 관련 궁금한 점이나 문제가 있으시면 댓글로 남겨 주세요. 도움이 되셨다면 이 글을 주변에 공유해 주시는 것도 잊지 마세요!


댓글 0
첫 댓글을 남겨보세요.