리눅스 top 명령어 사용법 - load average 해석과 단축키, 배치 모드 예제
이 명령어를 언제 쓰는가
"서버가 느리다"는 연락을 받고 SSH에 접속한 직후 치는 명령이다. CPU를 먹는 프로세스가 있는지, 메모리가 부족해 스왑을 쓰고 있는지, 아니면 CPU는 놀고 있는데 디스크 I/O를 기다리는 중인지를 한 화면에서 구분할 수 있다.
ps가 스냅샷이라면 top은 기본 3초 간격으로 갱신되는 동영상이다. 순간적으로 튀는 부하는 ps로는 잡히지 않고 top으로만 보인다.
기본 형식
top [-d 갱신초] [-p PID] [-u 사용자] [-b -n 횟수]
인자 없이 top만 치면 대화형 화면이 뜨고 q로 나온다. -b(batch)와 -n(반복 횟수)을 붙이면 화면 제어 문자 없이 텍스트로 출력되어 파일이나 파이프로 넘길 수 있다.
자주 쓰는 옵션
| 옵션 / 키 | 의미 | 예시 |
|---|---|---|
| -b | 배치 모드. 로그로 남길 때 필수 | top -b -n 2 |
| -n 횟수 | 지정 횟수만 갱신하고 종료 | top -b -n 2 -d 1 |
| -d 초 | 갱신 간격(기본 3초) | top -d 1 |
| -p PID | 특정 프로세스만 감시 | top -p 21874 |
| -u 사용자 | 특정 사용자 프로세스만 | top -u mysql |
| -H | 프로세스 대신 스레드 단위로 표시 | top -H -p 21874 |
| P (키) | CPU 사용률 순 정렬(기본값) | 화면에서 P |
| M (키) | 메모리 사용률 순 정렬 | 화면에서 M |
| 1 (키) | CPU 코어별로 나눠서 표시 | 화면에서 1 |
| c (키) | 명령 이름과 전체 명령줄을 토글 | 화면에서 c |
| e / E (키) | 프로세스 / 요약부의 단위를 KiB↔MiB↔GiB 전환 | 화면에서 E |
| W (키) | 현재 설정을 ~/.config/procps/toprc에 저장 | 화면에서 W |
화면 읽는 법
top - 14:22:31 up 41 days, 3:07, 2 users, load average: 3.21, 2.87, 2.40
Tasks: 214 total, 2 running, 212 sleeping, 0 stopped, 0 zombie
%Cpu(s): 18.4 us, 4.1 sy, 0.0 ni, 22.5 id, 54.6 wa, 0.0 hi, 0.4 si, 0.0 st
MiB Mem : 7862.4 total, 318.2 free, 2143.7 used, 5400.5 buff/cache
MiB Swap: 2048.0 total, 1920.0 free, 128.0 used. 5312.1 avail Mem
load average는 1분·5분·15분 평균 실행 대기 프로세스 수다. 코어 수로 나눠서 판단한다. 4코어에서 3.21이면 아직 여유가 있다. 중요한 건 리눅스의 load에는 CPU를 기다리는 프로세스뿐 아니라 디스크 I/O를 기다리는 D 상태 프로세스도 포함된다는 점이다. 위 예시처럼 wa(iowait)가 54.6인데 load가 높다면 CPU가 아니라 디스크가 범인이다.
st는 가상화 환경에서 하이퍼바이저에게 CPU를 뺏긴 시간이다. 클라우드 인스턴스에서 이 값이 지속적으로 크면 내 코드 문제가 아니라 호스트가 과밀한 것이다.
실전 예제
1) 크론에 넣어 부하 스냅샷을 기록한다. 새벽에만 느려지는 서버의 원인을 잡을 때 쓴다.
top -b -n 2 -d 1 | tail -n +8 >> /var/log/top-snapshot.log
2) 특정 프로세스의 CPU만 1초 간격으로 관찰한다. 배포 직후 애플리케이션이 안정화되는지 볼 때 쓴다.
top -d 1 -p $(pgrep -d, -f 'java -jar app.jar')
3) 어느 스레드가 CPU를 먹는지 찾는다. Java 애플리케이션의 CPU 100% 원인을 추적하는 표준 절차의 첫 단계다. 여기서 얻은 스레드 ID를 16진수로 바꿔 jstack 덤프와 대조한다. 아래 함정에서 설명하듯 첫 블록의 %CPU는 못 믿으므로 -n 2로 돌려 마지막 블록만 본다.
top -H -b -n 2 -d 1 -p 21874 | tail -20
4) 메모리 상위만 빠르게 확인한다. 대화형 화면에서 M을 누르는 것과 같은 효과를 배치 모드로 낸다.
top -b -n 1 -o %MEM | head -17
함정과 주의점
%CPU가 100을 넘는다고 당황할 필요 없다. top은 기본적으로 코어를 합산해서 표시한다(Irix 모드). 8코어 서버에서 모든 코어를 다 쓰는 프로세스는 800%로 나온다. 대화형 화면에서 I를 누르면 코어 수로 나눈 값으로 바뀐다.
top -b -n 1의 %CPU는 믿지 마라. top은 두 번의 샘플 차이로 CPU 사용률을 계산한다. 첫 번째 출력에는 비교 대상이 없어서 부팅 이후 누적 평균이 찍힌다. 오래 떠 있던 프로세스가 0.0%로 보이는 이유가 이것이다. 스크립트에서는 반드시 -n 2 이상으로 돌리고 마지막 블록만 쓴다.
free가 300MB밖에 안 남았다고 메모리 부족이 아니다. 리눅스는 남는 메모리를 전부 페이지 캐시(buff/cache)로 쓴다. 실제 여유는 맨 오른쪽 avail Mem이다. 위 예시는 5.3GiB가 남아 있는 정상 상태다.
컨테이너 안에서 top은 호스트 정보를 보여줄 수 있다. /proc이 네임스페이스로 격리되지 않기 때문에 컨테이너에 512MB 제한을 걸어도 호스트 전체 메모리가 표시된다. 컨테이너의 실제 한도는 cgroup 파일을 직접 봐야 한다.
함께 보면 좋은 명령어
- htop — top의 사용성을 개선한 도구. 마우스와 컬러, 트리 뷰를 지원한다. 별도 설치가 필요하다.
- vmstat —
vmstat 1로 CPU·메모리·I/O·스왑 추이를 한 줄씩 쌓아 본다. 추세 파악에 top보다 낫다. - iotop — iowait이 높을 때 어떤 프로세스가 디스크를 때리는지 지목해 준다.