안녕하세요. 지구 IDC 기술팀입니다.
오늘은 Ubuntu 22.04에서 CPU 사용률이 높은 프로세스를 확인하는 방법을 알아보겠습니다. 서버 응답이 느려지거나 웹·데이터베이스 처리 시간이 증가했을 때 전체 CPU 사용량만 확인하는 것보다 어떤 프로세스와 스레드가 CPU 시간을 소비하고 있는지 함께 확인해야 원인을 정확히 좁힐 수 있습니다.
이 문서에서는 기본 도구인 top과 ps로 CPU 사용량 상위 프로세스를 찾고, pidstat으로 일정 시간 동안 CPU 사용률이 지속되는지 측정하며, mpstat으로 특정 CPU 코어 포화·I/O 대기·가상화 환경의 steal time까지 구분하는 방법을 설명합니다.
적용 환경
| 항목 | 내용 |
|---|---|
| 운영체제 | Ubuntu 22.04 LTS |
| 기본 도구 | top, ps |
| 추가 도구 | pidstat, mpstat — sysstat 패키지 |
| 예시 PID | 1234 — 실제 확인한 PID로 변경 |
CPU 사용률 문제를 확인하는 순서
top으로 전체 CPU 상태와 CPU 사용량 상위 프로세스를 확인합니다.ps로 상위 프로세스를 빠르게 목록화합니다.pidstat으로 CPU 사용률이 일시적인지 지속적인지 측정합니다.mpstat으로 특정 코어만 포화되었는지 확인합니다.- 의심되는 PID의 실행 명령, 사용자와 스레드를 확인합니다.
- 높은
us,sy,wa,st값에 따라 애플리케이션·커널·디스크·가상화 문제를 구분합니다.
top으로 CPU 사용량이 높은 프로세스 확인
top은 Ubuntu 22.04에서 별도 패키지 설치 없이 사용할 수 있는 기본적인 실시간 프로세스 모니터링 도구입니다.
top
프로세스 목록에서 %CPU 열을 확인합니다. 실행 중 대문자 P를 누르면 %CPU 기준으로 정렬할 수 있으며, q를 누르면 종료됩니다.
화면 상단의 CPU 상태에서는 다음 항목을 함께 확인합니다.
| 항목 | 의미 | 확인 포인트 |
|---|---|---|
us |
일반 사용자 애플리케이션이 사용한 CPU 시간 | 웹 서버, DB, 애플리케이션 프로세스 부하 여부 |
sy |
커널이 사용한 CPU 시간 | 시스템 호출, 네트워크, 커널 작업이 과도한지 확인 |
id |
CPU가 유휴 상태였던 시간 | 지속적으로 낮다면 CPU 여유가 적을 수 있음 |
wa |
I/O 완료를 기다리는 동안의 시간 | CPU 문제보다 디스크·스토리지 병목인지 확인 |
st |
가상화 호스트가 다른 작업을 처리하느라 게스트가 CPU를 받지 못한 시간 | VPS에서 지속적으로 높다면 호스트 CPU 경합 가능성 확인 |
멀티코어 서버에서 각 논리 CPU의 상태를 따로 보고 싶다면 top 실행 중 숫자 1을 누릅니다. CPU0, CPU1처럼 코어별 사용 상태가 표시되어 단일 코어만 포화되는 문제를 찾는 데 도움이 됩니다.
ps로 CPU 사용량 상위 프로세스 빠르게 확인
대화형 화면 없이 CPU 사용률이 높은 프로세스를 한 번에 목록으로 확인하려면 ps를 사용할 수 있습니다.
ps -eo pid,ppid,user,stat,etime,pcpu,pmem,comm --sort=-pcpu | head -n 16
첫 줄은 헤더이므로 위 명령은 CPU 사용률 상위 프로세스 약 15개를 확인하는 용도로 사용할 수 있습니다. 주요 항목은 다음과 같습니다.
PID: 프로세스 IDPPID: 부모 프로세스 IDUSER: 실행 사용자STAT: 프로세스 상태ELAPSED: 프로세스 실행 시간%CPU: CPU 사용 비율%MEM: 물리 메모리 사용 비율COMMAND: 실행 프로그램 이름
pidstat으로 지속적인 CPU 사용량 측정
pidstat은 일정한 간격으로 프로세스별 CPU 사용 통계를 출력하므로 높은 CPU 사용량이 실제로 지속되는지 확인하기 좋습니다. Ubuntu 22.04에서는 sysstat 패키지로 설치합니다.
sudo apt update
sudo apt install -y sysstat
모든 활성 프로세스의 CPU 통계를 1초 간격으로 10회 확인합니다.
pidstat -u 1 10
주요 출력 항목은 다음과 같습니다.
%usr: 애플리케이션 사용자 영역에서 사용한 CPU 비율%system: 커널 영역에서 사용한 CPU 비율%wait: 프로세스가 실행 기회를 기다린 시간의 비율%CPU: 프로세스가 사용한 전체 CPU 비율CPU: 프로세스가 연결된 CPU 번호Command: 프로세스 이름
특정 PID만 계속 관찰하려면 아래의 1234를 실제 PID로 변경합니다.
pidstat -u -p 1234 1 10
한 번의 순간적인 CPU 급증보다 여러 측정 구간에서 계속 높은 값이 반복되는 프로세스를 우선적으로 확인하는 것이 좋습니다.
mpstat으로 CPU 코어별 상태 확인
전체 CPU 평균이 높지 않아도 단일 스레드 애플리케이션이 특정 코어 하나를 계속 사용하면 서비스가 느려질 수 있습니다. sysstat 패키지의 mpstat으로 모든 CPU를 1초 간격으로 10회 확인합니다.
mpstat -P ALL 1 10
%usr, %sys, %iowait, %steal, %idle을 비교합니다. 특정 CPU의 %idle이 계속 매우 낮고 다른 CPU는 여유가 있다면 단일 스레드 또는 CPU affinity의 영향을 의심할 수 있습니다.
VPS 환경에서는 %steal도 확인해야 합니다. 이 값은 하이퍼바이저가 다른 가상 CPU를 처리하는 동안 현재 VM이 CPU를 받지 못한 시간을 나타냅니다. 게스트 안의 특정 프로세스가 CPU를 과도하게 사용하지 않는데도 %steal이 지속적으로 높다면 호스트 CPU 경합 가능성을 함께 검토해야 합니다.
의심되는 프로세스와 스레드 상세 확인
CPU를 많이 사용하는 PID를 찾았다면 프로세스의 실제 실행 명령, 부모 프로세스, 실행 시간과 상태를 확인합니다. 아래의 1234는 실제 PID로 변경하십시오.
ps -p 1234 -o pid,ppid,user,stat,etime,pcpu,pmem,args
sudo readlink -f /proc/1234/exe
sudo cat /proc/1234/cgroup
Java, MySQL, 웹 애플리케이션처럼 하나의 프로세스 내부에 여러 스레드가 있는 경우 특정 스레드만 CPU를 계속 사용할 수 있습니다. 이때 스레드별 CPU 사용률을 확인합니다.
ps -L -p 1234 -o pid,tid,psr,stat,pcpu,comm --sort=-pcpu
TID는 스레드 ID, PSR은 해당 스레드가 마지막으로 실행된 CPU 번호를 보여줍니다. 특정 TID가 계속 높은 CPU를 사용한다면 애플리케이션 내부의 해당 작업을 추가로 조사해야 합니다.
프로세스가 systemd 서비스에 속한 것이 확인되면 해당 서비스의 상태와 최근 로그를 점검합니다. 서비스명은 실제 프로세스에 맞게 변경합니다.
systemctl status SERVICE_NAME.service --no-pager
sudo journalctl -u SERVICE_NAME.service --since "-15 min" --no-pager
CPU 상태 값으로 원인 구분
서버가 느리다고 해서 항상 애플리케이션 프로세스의 순수 CPU 연산이 원인은 아닙니다. top과 mpstat의 CPU 상태 값을 함께 보면 점검 방향을 빠르게 정할 수 있습니다.
| 관찰 결과 | 의미 | 점검 방향 |
|---|---|---|
us / %usr가 높음 |
사용자 애플리케이션 연산량이 큼 | top, pidstat으로 상위 PID와 스레드 확인 |
sy / %sys가 높음 |
커널 영역 작업 비중이 큼 | 네트워크, 디스크, 시스템 호출이 많은 프로세스와 커널 로그 확인 |
wa / %iowait가 높음 |
CPU가 I/O 완료를 기다리는 시간이 큼 | 디스크 I/O와 스토리지 지연 점검 |
st / %steal가 높음 |
VM이 호스트로부터 CPU 실행 시간을 받지 못함 | VPS 호스트 CPU 경합 또는 제공업체 상태 확인 |
전체 평균은 낮지만 한 CPU의 %idle만 매우 낮음 |
단일 코어 포화 가능성 | 단일 스레드 프로세스, 스레드별 CPU, affinity 확인 |
상황별 원인과 점검 방법
| 증상 | 가능한 원인 | 확인 방법 | 조치 방향 |
|---|---|---|---|
| 특정 프로세스가 계속 상위에 표시됨 | 애플리케이션 과부하, 무한 루프, 과도한 요청 처리 | pidstat -u -p PID 1 10, 서비스 로그 |
애플리케이션 로그·요청량·작업 내용을 확인한 뒤 정상 절차로 조치 |
| 짧은 시간만 CPU가 급증함 | Cron, systemd timer, 백업, 압축, 패키지 작업 | pidstat 반복 측정과 작업 스케줄 확인 |
작업 시간을 분산하고 중복 실행 여부 확인 |
| load average는 높지만 CPU idle도 높음 | CPU 실행 대기 외에 중단 불가능한 I/O 대기 작업이 포함될 가능성 | top의 wa, 프로세스 STAT, 디스크 I/O 확인 |
CPU 문제로 단정하지 말고 I/O 병목도 함께 점검 |
| 한 프로세스가 100%를 넘음 | 멀티스레드 프로세스가 여러 코어 사용 | ps -L, top의 스레드 표시 |
스레드별 CPU와 전체 코어 수를 고려해 정상 여부 판단 |
| VPS에서 CPU가 느린데 원인 프로세스가 뚜렷하지 않음 | 호스트 CPU 경합 | mpstat -P ALL의 %steal 확인 |
문제 시간대의 통계를 기록하고 가상화 호스트 상태 확인 |
조치 후 CPU 사용량 다시 확인
애플리케이션 설정, 작업 스케줄 또는 서비스 문제를 수정한 뒤에는 동일한 방법으로 일정 시간 다시 측정해 개선 여부를 확인합니다.
pidstat -u 1 10
mpstat -P ALL 1 10
프로세스 순위도 다시 확인합니다.
ps -eo pid,ppid,user,stat,etime,pcpu,pmem,comm --sort=-pcpu | head -n 16
CPU 사용률 수치뿐 아니라 실제 웹 응답 시간, 데이터베이스 처리 시간, 작업 완료 시간 등 서비스 지표도 함께 비교해야 조치 효과를 정확히 판단할 수 있습니다.
관련 지구 IDC 기술자료
공식 참고자료
| 기관 | 문서 | 확인 내용 | 조회일 |
|---|---|---|---|
| Ubuntu Manpages | top(1) — Ubuntu 22.04 | 실시간 프로세스·CPU 상태, %CPU, CPU별 표시, CPU 정렬, 멀티코어 환경의 CPU 비율 |
|
| Ubuntu Manpages | pidstat(1) — Ubuntu 22.04 | 프로세스별 %usr, %system, %wait, %CPU와 반복 측정 |
|
| Ubuntu Manpages | mpstat(1) — Ubuntu 22.04 | CPU별 사용 통계, %usr, %sys, %iowait, %steal, %idle |
|
| Ubuntu Project | List of releases | Ubuntu 22.04 LTS 지원 상태와 표준 지원 종료 시점 |
자주 묻는 질문
top에서 CPU 사용률이 100%를 넘는 것은 오류인가요?
반드시 오류는 아닙니다. 여러 CPU 코어가 있는 서버에서 멀티스레드 프로세스가 두 개 이상의 코어를 동시에 사용하면 기본적인 top 표시에서 하나의 프로세스가 100%를 넘을 수 있습니다. 스레드별 사용률과 전체 코어 수를 함께 확인하십시오.
CPU 사용률이 높은 프로세스는 top과 ps 중 어떤 명령으로 확인하는 것이 좋나요?
실시간 변화는 top이 적합하고, 현재 상태를 한 번에 목록으로 저장하거나 정렬하려면 ps가 편리합니다. 몇 초 이상 지속되는 사용률을 비교하려면 pidstat을 함께 사용하는 것이 좋습니다.
CPU 사용률은 낮은데 load average만 높은 이유는 무엇인가요?
Linux의 load average에는 CPU 실행 대기뿐 아니라 일부 중단 불가능한 대기 상태의 작업도 영향을 줄 수 있습니다. top에서 wa가 높은지, 프로세스 상태에 D가 많은지 확인하고 디스크 I/O 병목도 함께 점검하십시오.
VPS에서 특정 프로세스는 높지 않은데 서버가 CPU 부족처럼 느립니다. 무엇을 확인해야 하나요?
top의 st 또는 mpstat의 %steal 값을 확인하십시오. 지속적으로 높은 steal time은 가상화 호스트가 현재 VM에 충분한 CPU 실행 시간을 제공하지 못하는 상황과 관련될 수 있습니다.
CPU를 많이 쓰는 프로세스를 바로 kill 해도 되나요?
권장하지 않습니다. 먼저 PID, 실행 사용자, 실제 명령, 서비스 로그와 작업 내용을 확인해야 합니다. 종료가 필요하다면 가능하면 애플리케이션 또는 systemd 서비스의 정상 종료 절차를 사용하십시오.
마무리
오늘은 Ubuntu 22.04에서 CPU 사용률이 높은 프로세스를 확인하는 방법을 살펴봤습니다. top과 ps로 원인 후보를 찾고, pidstat으로 지속적인 CPU 사용 여부를 확인한 뒤 mpstat으로 코어별 사용률과 I/O 대기·steal time을 구분하면 문제의 범위를 빠르게 좁힐 수 있습니다.
높은 CPU 수치만 보고 프로세스를 즉시 종료하기보다 애플리케이션 처리량, 커널 사용률, 디스크 대기, 가상화 환경을 함께 확인해야 합니다. 특히 운영 서버에서는 원인 프로세스의 역할과 로그를 확인한 뒤 안전한 방법으로 조치하시기 바랍니다.
오늘 준비한 내용은 여기까지입니다. 다음에도 서버 운영에 도움이 되는 기술정보로 인사드리겠습니다.
中文
English
한국어