[EC2] top 명령어 제대로 이해하기

Nurrung·2023년 5월 21일
0
post-thumbnail

"top" 명령어를 통해 실시간으로 서버를 모니터링할 수 있다. 해당 명령어를 실행하면 전체적인 CPU / Memory의 사용량 및 프로세스 단위의 리소스 사용량을 확인할 수 있기 때문에 매우 유용하다.

따라서 이번 포스팅의 목적은 자주 사용하는 top 명령어의 "실행시 출력되는 결과"에 대한 이해도를 높이는 것이다. 목차를 설명한 뒤 바로 본문으로 넘어가겠다.


목차

(1). Top 명령어 실행 시 최상단의 5줄에 대한 이해
(2). Top 명령어 출력 화면에 대한 이해
(3). Top 명령어 예시


Top 명령어 실행 시 최상단의 5줄에 대한 이해

top command

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 구동 시간 : 사진과 같은 경우 1 day, 10:54로 표시된 부분이며, 현재 1일 10:54 시간 동안 서버가 구동되고 있다.
  • 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)으로 중지되지 않도록 권장하는 설정만큼 분배하는 것이 있다.

참고한 자료 및 출처

출처1
출처2


Top 명령어 출력 화면에 대한 이해

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 입력 -> 정해진 경로에 저장

시스템 관리를 하며 평소 top 명령어를 많이 사용하였는데 이번 기회에 몰랐던 부분과 스쳐지나갔던 여러 지표들에 대해 한번 더 살펴보고 이해 할 수 있어서 좋았다.

가끔은 자주 사용하는 툴에 대한 정리를 통해 가장 기초적인 부분에대한 자신감을 기르고 기본은 단단히 다지는 과정이 중요하게 느껴질 때가 있다.

profile
Good to see you guys

0개의 댓글

관련 채용 정보