[Linux] top 명령어 톺아보기

서버 모니터링에서 top 명령어는 리소스 사용 현황을 실시간으로 확인할 수 있어 매우 유용합니다. 이번 포스팅에서는 top 명령어를 통해 제공되는 출력 정보를 이해하는 데 초점을 맞추어 설명하겠습니다.


[목차]

  1. Top 명령어의 기본 출력 구성 이해
    • 최상단 요약 정보 (5줄) 분석
    • 프로세스별 리소스 사용량 (PID별 정보)
  2. 주요 리소스 지표 설명
    • CPU, 메모리, 스왑 메모리

1. Top 명령어의 기본 출력 구성 이해

최상단 요약 정보 (5줄) 분석

 

top : displays uptime information; 
Tasks : displays process status information
%Cpu(s) : displays various processor values
MiB Mem : displays physical memory utilization
MiB Swap : displays virtual memory utilization

top 명령어를 실행하면 사진처럼 최상단 5줄에 위의 정보가 우선적으로 출력된다.
그중에 가장 첫번째 라인의 top은 순서대로 "System time(현재 시간)", "System 구동 시간", "서버에 접속한 유저 수", "load average"를 보여준다.

  • System time : 시스템의 현재 시간이다. date 명령어를 치면 나오는 시간과 같다.
  • System 구동 시간 : 사진과 같은 경우 73 day, 15:03로 표시된 부분이며, 현재 73일 15:03 시간 동안 서버가 구동되고 있다.
  • User : 현재 시스템에 연결된 사용자의 수
  • Load average : 해당 줄에서 가장 중요한 지표이다. CPU 부하에 관련된 지표이며, 왼쪽부터 1분 / 5분 / 15분에 대한 부하 수치이다. CPU의 물리적 코어 및 쓰레드 등에 따라서 다르지만 싱글 코어 싱글 쓰레드(단일 코어 및 단일 쓰레드 시스템)에서 1.0 이상 부터는 현재 우려해야할 정도의 부하가 높다고 해석될 수 있다. 해당 지표에 대한 자세한 설명은 아래의 문서를 참고하면 좋다.
    (* https://scoutapm.com/blog/understanding-load-averages)

>> Tasks는 5개의 지표로 나뉘어지는데, 각각의 지표를 통해 아래의 정보를 얻을 수 있다.

  • total : 모든 상태의 프로세스 합계
  • running : 요청을 처리하고 정상적으로 실행하며 CPU 액세스 권한을 가진 프로세스 수
  • sleeping : 리소스를 대기 중인 프로세스. 이는 정상 상태이다.
  • stopped : 리소스가 해제된 상태로 중지된 프로세스. 이러한 프로세스는 상위 프로세스에 종료 메시지를 보낸다.
  • zombie : 부모 프로세스가 릴리스하기를 기다리는 프로세스. 부모 프로세스가 먼저 종료되면 고아가 될 수 있다.

>> %Cpu(s) 는 프로세스가 사용하는 CPU리소스에 대해 아래와 같은 자세한 지표를 보여준다.

  • us : 사용자 프로세스 실행에 소요된 시간의 백분율
  • sy : 커널 실행에 소요된 시간의 백분율
  • ni : 수동으로 구성된 nice 값으로 프로세스를 실행하는 데 소요된 시간의 백분율
  • id : 유휴 시간의 백분율(높은 경우 CPU가 충분히 여유가 있다고 판단)
  • wa : 대기 시간의 백분율(높은 경우 CPU가 I/O 액세스를 대기 중이라고 판단).
  • hi : 하드웨어 인터럽트를 관리하는 시간의 백분율
  • si : 소프트웨어 인터럽트를 관리하는 데 걸리는 시간의 백분율
  • st : 물리적 CPU에 대한 액세스를 대기하는 가상 CPU 시간의 백분율

위의 지표중 id, wa, st 지표등을 통해서 현재 시스템이 얼만큼 과부화 되었는지 알 수 있다. 특히 st은 시스템이 클라우드 환경으로 넘어 오면서 중요해진(?) 지표이다. Steal Time을 뜻하며, 설명대로 호스트의 물리적 CPU에 리소스를 할당받기 위해 대기하는 시간이다. 해당 시간이 길어지면 실제 시스템에서 사용하는 리소스는 낮을지라도 시스템에 과부화가 걸릴 수 있다.

>> MiB Mem 은 시스템이 가진 Memory에 대한 사용률을 보여준다.

  • total : 설치된 총 메모리
  • free : 사용 가능한 메모리
  • used : 사용된 메모리
  • buff/cache : 버퍼와 캐시로 사용되고 있는 메모리의 양

>> MiB Swap Linux는 스토리지 디스크에서 스토리지 공간을 빌려 물리적 메모리 공간을 사용할 때 가상 메모리를 활용할 수 있는데, 물리적 RAM과 스토리지 드라이브 간에 데이터를 주고 받는 프로세스는 시간이 많이 걸리고 시스템 리소스를 사용하므로 가상 메모리 사용을 최소화 하거나, DB프로세스등 중요한 프로세스가 메모리 부족(OOM)으로 중지되지 않도록 적절한 Swap 크기를 설정하는 것이 중요하다.

참고한 자료 및 출처

- 출처1
- 출처2


프로세스별 리소스 사용량 (PID별 정보)

PID; 프로세스 ID (PID)

  • The task's unique process ID, which periodically wraps, though never restarting at zero.

USER - User Name; 프로세스를 시작한 사용자의 유효한 사용자 ID (사용자 ID 와 매핑됨)

  • The effective user name of the task's owner.

PR - Priority; 작업의 예약 우선 순위 (Scheduling Priority)
'rt' 가 표시되면 작업이 실시간 예약 우선 순위로 실행되고 있음을 의미

  • The priority of the task.

NI - Nice value; 작업의 Nice 값으로 음수이면 우선 순위가 높고 양수이면 우선순위가 낮음.

  • The nice value of the task. A negative nice value means higher priority, whereas a positive nice value means lower priority. Zero in this field simply means priority will not be adjusted in determining a task's dispatchability.

VIRT - Swapped size (kb); 작업에 사용된 총 가상 메모리 양으로 프로세스가 사용하고 있는 가상 메모리의 전체 용량 (SWAP + RES)

  • The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out.

RES - Resident size (kb); 현재 프로세스가 사용하고 있는 물리 메모리 양. 실제로 메모리를 쓰고 있는 양을 확인하려면, RES를 확인하면 된다.

  • The non-swapped physical memory a task has used.
    (RES = CODE + DATA.)

SHR - Shared Mem size (kb); 공유 메모리 크기 (Shared Memory Size, 단위 - 키로바이트(KiB)) 으로 다른 프로세스와 공유하고 있는 공유 메모리의 양임.

  • The amount of shared memory used by a task. It simply reflects memory that could be potentially shared with other processes.

S - Process Status; 프로세스 상태
아래는 프로세스 상태를 나태내는 문자표이다.

D = 무중단 Sleep 상태 (Uninterruptible Sleep)

I = Idle

R = Running

S = Sleeping

T = 작업 제어 신호(Job Control Signal)에 의해 중지됨

t = Trace 중 디버거에 의해 중단된 상태

Z = Zombie
  • The status of the task which can be one of: 'D' = uninterruptible sleep 'R' = running 'S' = sleeping 'T' = traced or stopped 'Z' = zombie
    Tasks shown as running should be more properly thought of as 'ready to run' -- their task_struct is simply represented on the Linux run-queue. Even without a true SMP machine, you may see numerous tasks in this state depending on top's delay interval and nice value.

%CPU - CPU usage; CPU 사용량
:실제 SMP 환경에서 프로세스가 다중 스레드이고 top 이 스레드 모드에서 작동하지 않는 경우 100 % 보다 많은 양을 보고될 수 있음.

  • 작업/스레드 모드 변경 문자열은 'H' 임.

다중 프로세스 환경인 경우 Irix 모드가 Off 이면 top 은 작업의 CPU 사용량을 총 CPU 수로 나눈 Solaris 모드에서 작동함.

  • Irix/Solaris 모드 변경 문자열은 'I' 임.
  • 참고로 트리 구조 뷰 모드 변경 문자열은 'V' 이며 자식 프로세스 축소 변경 문자열은 'v' 임.
  • 이 두 옵션을 On 으로 실행할 경우 보이지 않는 자식 프로세스의 CPU 시간도 포함된다.
  • The task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time. In a true SMP environment, if 'Irix mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs. You toggle 'Irix/Solaris' modes with the 'I' interactive command.

%MEM - Memory usage (RES) ; 메모리 사용량으로 작업의 현재 사용한 실제 메모리 양

TIME+ - CPU Time ; CPU 시간 : 작업이 시작된 이후 사용한 총 CPU 시간

누적 모드가 On 이면 각 프로세스는 자신과 죽은 자식 프로세스가 사용한 CPU 시간과 함께 나열됨.

  • 누적 모드 변경 문자열은 'S' 임.
  • Total CPU time the task has used since it started. When 'Cumulative mode' is On, each process is listed with the cpu time that it and its dead children has used. You toggle 'Cumulative mode' with 'S', which is a command-line option and an interactive command. See the 'S' interactive command for additional information regarding this mode.

COMMAND - Command line or Program name ; 명령어 이름 또는 명령어 라인 :
작업을 시작하는 데 사용되는 명령어 라인 또는 관련 프로그램의 이름을 표시함.

  • 명령어 라인 또는 프로그램 이름 표시 변경 문자열은 'c' 임.
  • 명령어 라인 표시로 변경될 경우 명령어 라인이 없는 프로세스(예 : 커널 스레드)는 괄호 안에 프로그램 이름만 표시됨. (예 : [koromoon])
  • 대부분의 열과 달리 COMMAND 필드는 고정 너비가 아님.
  • 표시될 때, 다른 가변 너비 열과 함께 나머지 모든 화면 너비가 할당됨. (최대 512자)

참고한 자료 및 출처

출처1
출처2


Top 명령어 예시

  1. 기본 명령어으로 3초마다 출력 갱신
    $ top
  1. 화면 업데이트 시간 변경
    $ top -d [n초]
  • e.g. top -d 1 -> 1초마다 출력 갱신
  • -d : Delay time interval as: -d ss.tt (seconds.tenths)
    Specifies the delay between screen updates, and overrides the corresponding value in one's personal configuration file or the startup default. Later this can be changed with the 'd' or 's' interactive commands.
    Fractional seconds are honored, but a negative number is not allowed. In all cases, however, such changes are prohibited if top is running in 'Secure mode', except for root (unless the 's' command-line option was used). For additional information on 'Secure mode' see topic 5a. SYSTEM Configuration File.
  1. 프로세스 종료
    (1). top 명령 실행
    (2). k 입력
    (3). 종료를 원하는 PID 입력
  1. 명령어 출력 정렬 옵션
    (1). 'M' : 메모리 사용량 기준으로 정렬
    (2). 'P' : CPU 사용량 기준으로 정렬
    (3). 'N' : 프로세스 ID 별로 정렬
    (4). 'T' : 실행 시간을 기준으로 정렬
  1. Tasks/Threads 모드 전환
    (1). top 명령 실행
    (2). H 입력으로 Tasks <->THreads 모드 전환
  1. Command 필드 모드 변경
    (1). top 명령 실행
    (2). c를 통해 Command 필드에 프로그램 이름 <-> 명령어 모드 전환
  1. CPU 및 Memory 출력 모드 변경
    (1). top 명령 실행
    (2). 1 입력 -> 코어별 CPU 사용률 / VM일 경우 vCPU
    (3). t 및 m 을 반복 입력하면 출력 모드가 변경되는 것을 확인 가능
    -> t: CPU / m: Memory
  1. top 출력 결과 저장
    (1). top 명령 실행
    (2). A 입력
    (3). W 입력 -> 정해진 경로에 저장

 

Ref)
- 출처