- top 명령어를 사용하면 시스템의 상태를 전반적으로 가장 빠르게 파악할 수 있다. (CPU, Memory, Process)
- 옵션 없이 입력하면 interval 간격(기본 3초)으로 화면을 갱신하며 정보를 보여준다.
$ top -help
procps-ng 3.3.17
Usage:
top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
top - 21:22:27 up 232 days, 2:22, 3 users, load average: 0.00, 0.04, 0.05
Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.5 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem: 3712.0 total, 181.8 free, 2010.1 used, 1520.0 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1419.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 174752 12136 8484 S 0.3 0.3 516:12.38 systemd
2402 root 20 0 1498416 25636 7104 S 0.3 0.7 741:07.27 containerd
705636 ubuntu 20 0 10892 3840 3144 R 0.3 0.1 0:00.01 top
1677876 root 20 0 712200 6344 3292 S 0.3 0.2 26:35.67 containerd-shim
2 root 20 0 0 0 0 S 0.0 0.0 0:00.83 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
...
-
load average: 현재 시스템이 얼마나 일을 하는지를 나타냄. 3개의 숫자는 1분, 5분, 15분 간의 평균 실행/대기 중인 프로세스의 수. CPU 코어수 보다 적으면 문제 없음
-
Tasks: 프로세스 개수
-
KiB Mem, Swap: 각 메모리의 사용량
-
PR: 실행 우선순위
-
VIRT, RES, SHR: 메모리 사용량 => 누수 check 가능
-
S: 프로세스 상태(작업중, I/O 대기, 유휴 상태 등)
-
VIRT
- 프로세스가 사용하고 있는 virtual memory의 전체 용량
- 프로세스에 할당된 가상 메모리 전체
- SWAP + RES
-
RES
- 현재 프로세스가 사용하고 있는 물리 메모리의 양
- 실제로 메모리에 올려서 사용하고 있는 물리 메모리
- 실제로 메모리를 쓰고 있는 RES가 핵심!
-
SHR
- 다른 프로세스와 공유하고 있는 shared memory의 양
- 예시로 라이브러리를 들 수 있음. 대부분의 리눅스 프로세스는 glibc라는 라이브러리를 참고하기에 이런 라이브러리를 공유 메모리에 올려서 사용
top 실행 후 명령어
-
shift + p
: CPU 사용률 내림차순 -
shit + m
: 메모리 사용률 내림차순 -
shift + t
: 프로세스가 돌아가고 있는 시간 순 -
k
: kill. k 입력 후 PID 번호 작성. signal은 9 -
f
: sort field 선택 화면 -> q 누르면 RES순으로 정렬 -
a
: 메모리 사용량에 따라 정렬 -
b
: Batch 모드로 작동 -
1
: CPU Core별로 사용량 보여줌 -
ps와 top의 차이점
- ps는 ps한 시점에 proc에서 검색한 cpu 사용량을 출력한다.
- top은 proc에서 일정 주기로 합산해 실시간 cpu 사용량을 출력한다.
-
프로세스가 커널에게 필요한 메모리를 요청하면 커널은 프로세스에 메모리 영역을 주고 실제로 할당은 하지 않지만 해당 영역을 프로세스에게 주었다는 것을 저장해둔다.
-
이런 과정을 Memory commit이라 부른다.
-
왜 커널은 프로세스의 메모리 요청에 따라 즉시 할당하지 않고 Memory Commit과 같은 기술을 사용해 요청을 지연시킬까?
fork()
와 같은 새로운 프로세스를 만들기 위한 콜을 처리해야 하기 때문이다.fork()
시스템 콜을 사용하면 커널은 실행중인 프로세스와 똑같은 프로세스를 하나 더 만들고,exec()
시스템 콜을 통해 다른 프로세스로 변한다.- 이 때 확보한 메모리가 쓸모 없어질 수 있으므로,
COW(Copy-On-Write)
기법을 통해 복사된 메모리 영역에 실제 쓰기 작업이 발생한 후 실질적인 메모리 할당을 진행