1단계 — 부하 현황 파악
Bash
# Load Average 확인 (1분/5분/15분 평균)
uptime
# 예: load average: 4.20, 3.80, 2.10
# CPU 코어 수보다 높으면 과부하
nproc # CPU 코어 수 확인
# 실시간 CPU 상태
vmstat 2 10 # 2초 간격, 10회
# 주요 컬럼
# us: 유저 공간, sy: 커널, wa: I/O 대기, id: 유휴
# si/so: 스왑 입출력 (높으면 메모리 부족)2단계 — CPU 사용 프로세스 특정
Bash
# top 실행 후
top
# P 키: CPU 정렬
# M 키: 메모리 정렬
# k 키: PID로 프로세스 종료
# 1 키: 코어별 CPU 표시
# 1회성 스냅샷 (정렬)
ps aux --sort=-%cpu | head -15
# 특정 프로세스 CPU 추적
pidstat -u -p 1234 2 5 # PID 1234, 2초 간격, 5회3단계 — 프로세스 내 병목 분석
Bash
# strace — 시스템 콜 추적
strace -p 1234 -c # 시스템 콜 통계 요약
strace -p 1234 -e trace=read,write # 특정 콜만
# perf — 성능 카운터 프로파일링
sudo apt install -y linux-tools-common linux-tools-$(uname -r)
# 10초간 CPU 이벤트 수집
sudo perf record -g -p 1234 -- sleep 10
# 결과 분석
sudo perf report
# 시스템 전체 핫스팟 (5초)
sudo perf top
# lsof — 프로세스가 여는 파일 수 확인
sudo lsof -p 1234 | wc -l4단계 — CPU 유형별 원인
us(유저) CPU가 높을 때
Bash
# 무한 루프·비효율 알고리즘 의심
# 스택 트레이스 확인 (Python)
sudo py-spy top --pid 1234
# Java
sudo jstack 1234 | grep -A 5 "RUNNABLE"
# Node.js
kill -USR1 1234 # node --prof 모드 활성화sy(커널) CPU가 높을 때
Bash
# 시스템 콜 과다 의심
strace -p 1234 -c -S calls | head -20
# 인터럽트 확인
cat /proc/interrupts | sort -k2 -rn | head -10wa(I/O 대기) CPU가 높을 때
Bash
# I/O 병목 (트러블슈팅 별도 가이드 참조)
iostat -x 2 5
iotop -o5단계 — 임시 완화
Bash
# 특정 프로세스 CPU 사용 제한 (cgroups)
sudo apt install -y cpulimit
cpulimit -p 1234 -l 50 # PID 1234를 CPU 50%로 제한
# nice 값으로 우선순위 낮추기
renice -n 15 -p 1234
# OOM Killer 점수 조정 (중요 프로세스 보호)
echo -1000 > /proc/1234/oom_score_adj체크리스트
- Load average가 코어 수를 지속적으로 초과하는가?
- 특정 프로세스 1개가 CPU의 100%를 점유하는가?
- 최근 배포나 코드 변경이 있었는가?
- wa 비율이 높은가? → I/O 병목으로 전환
- 프로세스 수가 비정상적으로 많은가? → fork 폭탄 의심
편집 안내 · Editorial Note
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.