본문 바로가기
TYLER SONGBlog
← Blog index
CS학습6 min read

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을 처음 실행한 첫 화면의 값은 부팅 이후 평균에 가깝고, 이후 갱신부터 갱신 주기 기준 값이 표시된다.

요약 영역 읽기

text
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. 코드 예제

기본 실행과 대화형 단축키

shell
top

실행 중 사용할 수 있는 대표 키는 다음과 같다.

키동작
q종료
PCPU 사용률 순 정렬
M메모리 사용률 순 정렬
T누적 실행 시간 순 정렬
1코어별 CPU 사용률 표시 토글
c전체 명령줄 표시 토글
kPID를 입력해 시그널 전송(프로세스 종료)
u특정 사용자 프로세스만 표시
d 또는 s갱신 주기 변경
H프로세스 대신 스레드 단위로 표시

자주 쓰는 옵션

shell
# 특정 PID만 감시 (쉼표로 여러 개 지정 가능) top -p 1234 # 특정 사용자의 프로세스만 표시 top -u www-data # 갱신 주기를 1초로 설정 top -d 1 # 스레드 단위로 표시 top -H

배치 모드: 스크립트와 로그 수집

-b(batch) 옵션은 화면 제어 없이 출력만 하므로 파이프나 파일 저장에 적합하고, -n으로 반복 횟수를 지정한다.

shell
# 1회만 출력하고 상위 15줄만 확인 top -b -n 1 | head -n 15 # 5초 간격으로 3번 수집해 파일에 저장 top -b -d 5 -n 3 > /tmp/top_snapshot.txt

정렬 지정 (procps-ng 최신 버전)

shell
# 메모리 사용률 기준 정렬 후 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 값이 지속적으로 높으면 가상 머신이 호스트 자원을 충분히 받지 못하고 있다는 뜻이다. 클라우드 인스턴스 성능 저하 원인을 가릴 때 유용하다.

장애 시점 기록 배치 모드로 주기적으로 파일에 저장해두면 사후 분석에 쓸 수 있다.

shell
top -b -n 1 -o %CPU | head -n 20 >> /var/log/top_cpu.log

7. 주의할 점

  • 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, 코어 수와 함께 해석한다.