top: 실행 중인 프로세스의 CPU·메모리 사용량을 실시간으로 보는 명령어
top은 리눅스에서 실행 중인 프로세스와 시스템 전체의 CPU, 메모리 사용 현황을 주기적으로 갱신해 보여주는 모니터링 명령어다. 서버가 느려졌을 때 어떤 프로세스가 자원을 점유하는지 가장 먼저 확인하는 도구로 쓰인다. 화면 상단의 요약 정보와 프로세스 목록의 각 열을 읽는 방법, 대화형 단축키, 배치 모드 사용법을 정리한다.
By 송민성
1. 개념
top은 현재 실행 중인 프로세스(process)별 CPU·메모리 사용량과 시스템 전체 자원 상태를 일정 주기(기본 약 3초)마다 갱신하여 터미널에 보여주는 명령어다. 대부분의 리눅스 배포판에 기본 포함된 procps 패키지에 들어 있다.
화면은 크게 두 영역으로 나뉜다.
- 요약 영역(summary area): 업타임, 로드 애버리지(load average), 작업(task) 수, CPU, 메모리, 스왑 상태
- 프로세스 목록(task area): 프로세스별 PID, 사용자, CPU%, MEM%, 실행 명령 등
2. 왜 사용하는가
웹 서비스 운영 중 "서버가 느리다", "응답이 없다" 같은 상황에서 원인을 좁히는 첫 단계가 필요하다. top은 별도 설치 없이 바로 쓸 수 있고, 다음 질문에 빠르게 답해준다.
- CPU를 가장 많이 쓰는 프로세스는 무엇인가?
- 메모리가 부족해 스왑(swap)을 쓰고 있는가?
- 시스템 부하(load)가 코어 수에 비해 높은가?
- 좀비(zombie) 프로세스가 쌓이고 있는가?
3. 동작 원리
top은 리눅스 커널이 가상 파일 시스템 /proc으로 노출하는 정보를 주기적으로 읽어 계산한다.
/proc/loadavg: 로드 애버리지/proc/stat: 시스템 전체 CPU 시간 누적값/proc/meminfo: 메모리 정보/proc/<PID>/stat,/proc/<PID>/status: 프로세스별 정보
CPU 사용률은 순간값이 아니라 두 시점 사이의 CPU 시간 증가량을 경과 시간으로 나눠 구한다. 그래서 top을 처음 실행한 첫 화면의 값은 부팅 이후 평균에 가깝고, 이후 갱신부터 갱신 주기 기준 값이 표시된다.
요약 영역 읽기
top - 14:05:12 up 3 days, 2:11, 1 user, load average: 0.52, 0.48, 0.40
Tasks: 180 total, 1 running, 179 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 1.0 sy, 0.0 ni, 95.5 id, 0.3 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 7940.0 total, 1200.0 free, 3100.0 used, 3640.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4500.0 avail Mem- load average: 최근 1분, 5분, 15분 동안 실행 중이거나 실행 대기 중인(리눅스에서는 중단 불가능한 I/O 대기 상태 포함) 작업 수의 평균. 코어 수와 비교해 해석한다. 4코어 시스템에서 지속적으로 4를 크게 넘으면 대기가 쌓이고 있다는 신호다.
- us / sy / ni / id / wa / hi / si / st: 사용자 영역, 커널 영역, nice 조정된 프로세스, 유휴(idle), I/O 대기(I/O wait), 하드웨어 인터럽트, 소프트웨어 인터럽트, 가상화 환경에서 하이퍼바이저에 빼앗긴 시간(steal)
- avail Mem: 스왑 없이 새 프로세스에 할당 가능한 메모리의 추정치.
free보다 실제 여유를 더 잘 나타낸다. 리눅스는 남는 메모리를 파일 캐시(buff/cache)로 활용하므로free가 작아도 문제가 아닐 수 있다.
프로세스 목록의 주요 열
| 열 | 의미 |
|---|---|
| PID | 프로세스 ID |
| USER | 프로세스 소유자 |
| PR / NI | 우선순위 / nice 값 |
| VIRT | 가상 메모리 크기 |
| RES | 실제 물리 메모리에 올라간 크기 |
| SHR | 공유 메모리 크기 |
| S | 상태 (R 실행, S 슬립, D 중단 불가 대기, Z 좀비 등) |
| %CPU | 갱신 구간 동안의 CPU 사용률 |
| %MEM | 물리 메모리 대비 RES 비율 |
| TIME+ | 누적 CPU 사용 시간 |
| COMMAND | 실행 명령 |
멀티코어 환경에서 %CPU는 코어 하나를 100%로 계산하므로, 멀티스레드 프로세스는 100%를 넘을 수 있다(기본 Irix 모드).
4. 코드 예제
기본 실행과 대화형 단축키
top실행 중 사용할 수 있는 대표 키는 다음과 같다.
| 키 | 동작 |
|---|---|
| q | 종료 |
| P | CPU 사용률 순 정렬 |
| M | 메모리 사용률 순 정렬 |
| T | 누적 실행 시간 순 정렬 |
| 1 | 코어별 CPU 사용률 표시 토글 |
| c | 전체 명령줄 표시 토글 |
| k | PID를 입력해 시그널 전송(프로세스 종료) |
| u | 특정 사용자 프로세스만 표시 |
| d 또는 s | 갱신 주기 변경 |
| H | 프로세스 대신 스레드 단위로 표시 |
자주 쓰는 옵션
# 특정 PID만 감시 (쉼표로 여러 개 지정 가능)
top -p 1234
# 특정 사용자의 프로세스만 표시
top -u www-data
# 갱신 주기를 1초로 설정
top -d 1
# 스레드 단위로 표시
top -H배치 모드: 스크립트와 로그 수집
-b(batch) 옵션은 화면 제어 없이 출력만 하므로 파이프나 파일 저장에 적합하고, -n으로 반복 횟수를 지정한다.
# 1회만 출력하고 상위 15줄만 확인
top -b -n 1 | head -n 15
# 5초 간격으로 3번 수집해 파일에 저장
top -b -d 5 -n 3 > /tmp/top_snapshot.txt정렬 지정 (procps-ng 최신 버전)
# 메모리 사용률 기준 정렬 후 1회 출력
top -b -n 1 -o %MEM | head -n 15-o 옵션은 procps-ng 3.3.x 이후 버전에서 사용할 수 있다. 오래된 배포판에서는 지원하지 않을 수 있으니 top -h로 확인한다.
5. 시간 복잡도 또는 성능 특성
top 자체의 시간 복잡도를 논하는 일은 드물지만, 성능 특성은 알아둘 만하다.
- 매 갱신마다
/proc아래의 모든 프로세스 디렉터리를 읽으므로, 프로세스 수가 많을수록top자체의 비용도 늘어난다. - 갱신 주기를 너무 짧게(
-d 0.1등) 설정하면 모니터링 도구가 오히려 부하를 만든다. - 표시되는 값은 샘플링 구간의 평균이므로, 그보다 짧은 순간적인 스파이크는 놓칠 수 있다.
6. 실무 사용 사례
CPU 점유 프로세스 찾기 top 실행 후 P로 정렬해 상위 프로세스를 확인한다. Node.js 서버가 단일 코어를 100% 가까이 쓰고 있다면 이벤트 루프를 막는 동기 작업이 있는지 의심해볼 수 있다.
메모리 누수 의심 M으로 정렬한 뒤 특정 프로세스의 RES가 시간이 지날수록 계속 증가하는지 관찰한다. 일시적 사용량 증가와 구분하려면 일정 시간 동안 추이를 봐야 한다.
I/O 병목 구분 CPU의 id는 높은데 wa가 높고 로드 애버리지도 높다면, CPU가 아니라 디스크나 네트워크 I/O가 병목일 가능성이 크다.
컨테이너·가상화 환경 st 값이 지속적으로 높으면 가상 머신이 호스트 자원을 충분히 받지 못하고 있다는 뜻이다. 클라우드 인스턴스 성능 저하 원인을 가릴 때 유용하다.
장애 시점 기록 배치 모드로 주기적으로 파일에 저장해두면 사후 분석에 쓸 수 있다.
top -b -n 1 -o %CPU | head -n 20 >> /var/log/top_cpu.log7. 주의할 점
- VIRT는 실제 사용량이 아니다. 예약된 가상 주소 공간까지 포함하므로 크게 보여도 문제가 아닌 경우가 많다. 실제 메모리 부담은
RES를 기준으로 본다. - free가 작다고 메모리 부족이 아니다. 커널이 캐시로 활용 중일 수 있으므로
avail Mem과 스왑 사용량을 함께 본다. - 로드 애버리지는 CPU 사용률이 아니다. 코어 수와 함께 해석해야 한다.
- %CPU가 100%를 넘을 수 있다. 멀티코어에서 코어 단위 합산이기 때문이다.
top실행 중I(Irix/Solaris 모드 토글)로 전체 CPU 대비 비율로 바꿀 수 있다. - `k`로 프로세스를 종료할 때는 PID를 정확히 확인한다. 운영 서버에서 잘못된 프로세스에 시그널을 보내면 장애로 이어질 수 있다.
- 컨테이너 안에서는 호스트 전체 값이 보일 수 있다.
/proc의 일부 정보가 컨테이너 제한(cgroup)이 아니라 호스트 기준이라 해석에 주의가 필요하다. - 더 편한 대안이 있다.
htop은 색상과 트리 보기, 마우스 조작을 지원하지만 기본 설치되어 있지 않은 경우가 많다.top은 어디서나 쓸 수 있다는 점이 강점이다.
8. 핵심 정리
top은/proc의 정보를 주기적으로 읽어 시스템 요약과 프로세스별 자원 사용량을 보여주는 실시간 모니터링 도구다.- 요약 영역에서는 로드 애버리지, CPU 상태(
us,sy,id,wa,st),avail Mem을 우선 확인한다. - 프로세스 목록에서는
%CPU,RES,S(상태)를 중심으로 본다. P,M,1,c,H같은 단축키로 정렬과 표시 방식을 바꿀 수 있다.top -b -n 1처럼 배치 모드를 쓰면 스크립트와 로그 수집에 활용할 수 있다.VIRT,free, 로드 애버리지는 오해하기 쉬운 지표이므로RES,avail Mem, 코어 수와 함께 해석한다.