Devin.KR
로그인

리눅스 top 명령어 사용법 - load average 해석과 단축키, 배치 모드 예제

개발자 조회 1

이 명령어를 언제 쓰는가

"서버가 느리다"는 연락을 받고 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의 사용성을 개선한 도구. 마우스와 컬러, 트리 뷰를 지원한다. 별도 설치가 필요하다.
  • vmstatvmstat 1로 CPU·메모리·I/O·스왑 추이를 한 줄씩 쌓아 본다. 추세 파악에 top보다 낫다.
  • iotop — iowait이 높을 때 어떤 프로세스가 디스크를 때리는지 지목해 준다.