top
- top은 리눅스와 유닉스에서 실행 가능한 프로세스 모니터링 유틸리티이다.
- 사용자가 시스템 상태를 실시간으로 모니터링하고, CPU, 메모리 등의 자원 사용량, 프로세스 우선순위 등을 파악할 수 있다.
- 옵션 없이 입력하면 interval 간격(기본 3초)으로 화면을 갱신하며 정보를 보여준다.
top 실행 전 옵션
- -b : 순간의 정보를 확인 (batch 모드)
- -n : top 실행 주기 설정 (반복 횟수)
top 실행 후 명령어
- shift + p : CPU 사용률 내림차순
- shift + m : 메모리 사용률 내림차순
- shift + t : 프로세스가 돌아가고 있는 시간 순
- k : kill, k 입력 후 PID 번호 작성, signal은 9
- f : soft field 선택 화면 → q 누르면 RES 순으로 정렬
- a : 메모리 사용량에 따라 정렬
- b : Batch 모드로 작동
- 1 : CPU Core별로 사용량 보여줌
첫 번째 줄
시스템 현재 시간, OS가 살아있는 시간, 유저 세션수 (System time, uptime and user sessions)
- CPU Load의 이동 평균을 표시 (시스템 부하 상태를 나타내는 지표)
- CPU Load란 CPU가 수행하는 작업의 양 이다. 리눅스에서는 실행되거나 대기중인 프로세스의 평균이다.
- 앞에서부터 1분, 5분, 15분에 대한 평균 부하를 나타낸다.
- 각 숫자는 부하가 일어난 프로세스나 스레드가 CPU 코어를 몇 개 사용했는지 나타내는데, 만약 숫자가 CPU 코어 수보다 높다면 시스템이 과부하 상태에 놓여 있다는 것을 의미한다.
- 싱글 코어일 경우 1.0의 값이 CPU 100%를 사용하고 있다는 의미이다. 멀티 코어라면 해당 코어수 만큼 * N을 한 값이 CPU 100%를 사용한다는 의미가 된다. 만약 100%를 넘어간다면 CPU에서 처리하지 못하고 대기중인 프로세스가 있다는 것임.
두 번째 줄 (Tasks)
- 두 번째 줄에는 Tasks에 관한 내용이 출력된다.
- Tasks는 현재 프로세스들의 상태를 나타내주는 영역이다.
- Total은 전체 프로세스, running은 running 상태인 프로세스, sleeping은 대기상태인 process, stopped는 종료된 프로세스, zombies는 좀비상태인 프로세스의 수를 나타낸다.
- 프로세스는 일반적으로 IO 기반의 일(IO bound)과 CPU 기반의 일(CPU-bound)을 번갈아 가면서 수행하게 된다.
- 이러한 프로세스의 상태는 일반적으로 아래와 같다.
- IO 기반의 일을 하게 될 때는 CPU는 idle 타임에 들어가게 된다. 또한 프로세스 스케줄링 알고리즘에 의해 프로세스는 번갈아가면서 실행하게 된다.
- 이렇게 멀티테스킹 작업을 시도하는데 이때 프로세스에는 아래와 같은 상태의 변동이 있다.
- 실행(Runnable) : CPU에 의해서 명령어가 실행중인 Process
- 준비(Ready) - CPU의 명령어 실행을 기다리는 Process
- 대기(Waiting) - I/O operation이 끝나기를 기다리는 Process
- 종료(Terminated) - Ctrl + Z 등의 siganl로 종료된 Process
- Zombie : Process는 root process로 부터 뿌리내린 자식 Process의 형식으로 트리구조를 형성한다. 이 때 부모가 먼저 종료된다면 root process로 부터 닿을 수 없는 Process가 생긴다. 이를 zombie process라고 부른다.
세 번째 줄 (CPU 사용량)
- CPU가 어떻게 사용되고 있는지 그 사용율을 보여주는 영역이다.
- 모든 값의 총 합은 100% 이며 이를 퍼센테이지로 나누어서 보여준다.
- 각 요소는 아래와 같다.
- us : 프로세스의 유저 영역에서의 CPU 사용률
- sy : 프로세스의 커널 영역에서의 CPU 사용률
- ni : 프로세스의 우선순위(priority) 설정에 사용하는 CPU 사용률
- id : 사용하고 있지 않는 비율
- wa : IO가 완료될때까지 기다리고 있는 CPU 비율
- hi : 하드웨어 인터럽트에 사용되는 CPU 사용률
- si : 소프트웨어 인터럽트에 사용되는 CPU 사용률
- st : CPU를 VM에서 사용하여 대기하는 CPU 비율
네 번째 줄 (메모리 사용량)
- 메모리에 관련된 영역이다.
- 첫 번째 줄은 RAM의 메모리 영역으로 Mem이라 표시되어 있는 부분이다. 그리고 아랫줄은 디스크를 메모리 처럼 이용하는 Swap 메모리 영역이다.
- 일반적으로 Mem의 사용량이 거의 가득 찼을때 Swap 메모리 영역을 사용한다. 이 영역은 디스크이기 때문에 RAM 메모리보다 속도가 많이 느린 단점을 가진다.
- total : 총 메모리 양
- free : 사용가능한 메모리 양
- used : 사용중인 메모리 양\
- buff/cache에서 buff는 buffers의 약자이다. 이 값은 커널 버퍼에서 사용되는 메모리를 뜻한다.
- cache는 Disk의 페이지 캐시를 말한다. 즉, buff/cache는 IO와 관련되어 사용되는 버퍼에 사용되는 메모리를 말한다. 이 메모리가 있으므로써 IO에 상대적으로 빠른 속도를 가질 수 있다.
- availMem은 swap 메모리를 사용하지 않고 사용할 수 있는 메모리의 크기를 말한다.
디테일 영역
- 디테일 영역에는 각 프로세스에 대한 상세한 내용이 나온다.
- PID : PID는 프로세스 ID이며 프로세스를 구분하기 위한 겹치지않는 고유한 값이다.
- USER : 해당 프로세스를 실행한 USER 이름 또는 효과를 받는 USER의 이름이다.
- PR : 커널에 의해서 스케줄링되는 우선순위이다.
- NI : PR에 영향을 주는 nice라는 값이다.
- VIRT, RES, SHR, %MEM
- 해당 필드들은 프로세의 메모리와 관련이있다.
- VIRT
- 프로세스가 소비하고 있는 총 메모리이다. 프로그램이 실행중인 코드, heap, stack과 같은 메모리, IO buffer 메모리를 포함한다.
- 프로세스에 할당된 가상 메모리 전체
- SWAP + RES
- RES
- RAM에서 사용중인 메모리의 크기를 나타낸다.
- 현재 프로세스가 사용하고 있는 물리 메모리의 양
- 실제로 메모리를 쓰고 있는 RES가 핵심
- SHR
- 다른 프로세스와의 공유메모리(Shared Memory)를 나타낸다.
- 예시로 라이브러리를 들 수 있다. 대부분의 리눅스 프로세스는 glibc라는 라이브러리를 참고하기에 이런 라이브러리를 공유 메모리에 올려서 사용
- %MEM : RAM에서 RES가 차지하는 비율을 나타낸다.
- S : 프로세스의 현재 상태를 나타낸다. (작업중, I/O 대기, 유휴 상태 등)
- TIME+ : 프로세스가 사용한 토탈 CPU 시간
- Command : 해당 프로세스를 실행한 커맨드를 나타낸다.
Memory Commit
- 프로세스가 커널에게 필요한 메모리를 요청하면 커널은 프로세스에 메모리 영역을 주고 실제로 할당은 하지 않지만 영역을 프로세스에게 주었다는 것을 저장해둔다.
- 이런 과정을 Memory commit이라 부른다.
- 커널이 프로세스의 메모리 요청에 따라 즉시 할당하지 않고 Memory Commit과 같은 기술을 사용해 요청을 지연시키는 이유
- fork()와 같은 새로운 프로세를 만들기 위한 콜을 처리해야 하기 때문이다.
- fork() 시스템 콜을 사용하면 커널은 실행중인 프로세스와 똑같은 프로세스를 하나 더 만들고, exec() 시스템 콜을 통해 다른 프로세스로 변한다. 이 때 확보한 메모리가 쓸모 없어질 수 있다.
- COW(Copy-On-Write) 기법을 통해 복사된 메모리 영역에 실제 쓰기 작업이 발생한 후 실질적인 메모리 할당을 진행
프로세스 상태
- SHR 옆에 있는 S 항목으로 볼 수 있다.
- D : Uninterruptiable sleep, 디스크 혹은 네트워크 I/O를 대기
- R : 실행 중(CPU 자원을 소모)
- S : Sleeping 상태, 요청한 리소스를 즉시 사용 가능
- T : Traced or Stopped, 보통의 시스템에서 자주 볼 수 없는 상태
- Z : zombie, 부모 프로세스가 죽은 자식 프로세스
명령어 표
명령어 | 설명 |
1 | CPU 코어별 사용 현황 |
m | 메모리 사용률 시각화 표시 |
shift + p | CPU 사용률이 높은 프로세스를 기준으로 나열 |
shift + m | 메모리 사용률이 높은 프로세스를 기준으로 나열 |
shift + t | 수행 시간이 긴 프로세스를 기준으로 나열 |
k | kill 할 프로세스 PID를 입력할 수 있다 |
H | 상단의 Tasks 기준을 쓰래드로 변경 |
u | 모니터링할 user를 선택하여, 해당 권한 프로세스 감시 |
top 유틸리티를 개선한 htop, vtop, gtop, gotop등 다양한 유틸리티도 있다.
References
[2] https://zzsza.github.io/development/2018/07/18/linux-top/