Wisdom’s Cloud
[Linux] [CentOS] 프로세스 정보 확인 본문
top 명령어
top 명령어를 사용하여 프로세스의 상태를 전반적으로 파악할 수 있다.
옵션 없이 실행하면 3초 간격으로 화면을 갱신하여 정보를 보여주며, 출력 화면에 대해 살펴보도록 하자.
[root@jhpark20 ~]# top
top - 07:59:52 up 2 days, 8:10, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 83 total, 1 running, 82 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1014676 total, 421912 free, 125864 used, 466900 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 689512 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 128156 6724 4180 S 0.0 0.7 0:04.84 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:00.37 kworker/u2:0
1. PID, USER
PID(Process ID)는 task의 고유한 프로세스 ID이며, USER는 task의 소유자 이름이다.
2. PR, NI
PR(Priority)은 task의 우선 순위이며, NI(Nice Value)는 task의 nice 값이다.
먼저 프로세스의 스케줄링 과정은 아래와 같다.
- Scheduler는 유휴 상태에 있던 프로세스가 깨어나거나 특정 프로세스가 스케줄링을 양보하는 등의 경우에 Run Queue에서 우선순위가 가장 높은 프로세스를 꺼내서 Dispatcher에 넘겨준다.
- Dispatcher는 현재 실행 중인 프로세스의 정보를 다른 곳에 저장한 후, 넘겨받은 프로세스의 정보를 가지고 다시 연산을 하도록 CPU에 요청한다.
여기서 우선순위는 PR 값으로, 값이 낮을수록 우선순위가 높은 것이다.
기본적으로 모든 프로세스들은 20의 우선순위 값을 가지는데, nice 명령어를 통해 PR 값을 낮출 수 있다.
PID 4인 프로세스를 보면, nice 값이 -20이므로 20에 -20이 적용된 0이 되어 우선순위가 가장 높은 프로세스라는 것을 알 수 있다.
그렇다면 우선순위가 낮은 프로세스가 항상 먼저 끝나는 것일까?
먼저 끝날 때도 있고 더 늦게 끝날 때도 있는데, 그 이유는 바로 CPU Core 수와 관련 있다.
CPU Core 수와 동일한 수의 프로세스가 돌아가고 있다면, CPU 경합을 벌일 필요가 없기 때문에 우선순위가 낮아도 비슷한 시간에 끝나므로 잘 계산해서 우선순위를 조절해야 한다.
그리고 PR 값이 RT로 표현되는 프로세스가 있는데, 이 프로세스들은 반드시 특정 시간 안에 종료되어야 하는 중요한 프로세스들이다.
이는 시스템의 안정적인 운영을 위한 것이기 때문에 우선순위와 상관없이 일반적인 사용자가 생성한 프로세스들보다 더 먼저 실행된다.
3. VIRT, RES, SHR
VIRT(Virtual Memory Size)는 task에 할당된 가상 메모리의 전체 용량이며, RES(Resident Memory Size)는 그중에서 task가 실제로 사용하고 있는 물리 메모리의 양이고, SHR(Shared Memory Size)은 다른 task와 공유하고 있는 공유 메모리의 양이다.
그렇다면 왜 메모리는 VIRT와 RES로 구분되는 것일까?
그 이유는 바로 Memory Commit을 하기 때문이다.
먼저 프로세스에 메모리를 할당하는 과정은 아래와 같다.
- 프로세스가 malloc()과 같은 시스템 콜로 필요한 메모리 영역을 커널에 요청한다.
- 이에 대해 커널은 가용 영역이 있다면 성공 메시지와 함께 가상 메모리 주소를 전달한다.
- 그 후 프로세스가 할당받은 가상 메모리 영역에 실제로 쓰기 작업을 하면 Page Fault가 발생한다.
- 커널은 그제서야 프로세스에 물리 메모리를 할당하고, 물리 메모리에 가상 메모리를 매핑한 것을 Page Table로 관리한다.
즉, 여기서 커널이 프로세스의 메모리 요청에 따라 가상 메모리를 주고 물리 메모리를 바로 할당하지 않는 것을 Memory Commit이라고 한다.
그렇다면 왜 Memory Commit을 하는 것일까?
가장 큰 이유는 fork()와 같은 새로운 프로세스를 만들기 위한 시스템 콜을 처리해야 하기 때문이다.
먼저 프로세스의 생성 과정은 아래와 같다.
- 모든 프로세스는 fork()를 통해서 만들어지기 때문에 부모와 자식 관계가 된다.
- fork() 시스템 콜을 통해 부모 프로세스를 복제하여 자식 프로세스를 생성한다.
- 자식 프로세스는 exec() 시스템 콜을 통해 새로운 프로그램을 실행한다.
- 자식 프로세스가 실행되고 있는 동안 부모 프로세스는 wait() 시스템 콜을 통해 자식 프로세스가 종료되기 전까지 대기한다.
- 자식 프로세스가 종료되면 exit() 시스템 콜을 통해 부모 프로세스에게 종료를 알린다.
여기서 자식 프로세스가 exec() 시스템 콜을 통해 전혀 다른 프로세스로 변화는 과정에서 복제된 메모리 영역이 대부분 쓸모 없어지게 된다.
따라서 자식 프로세스는 부모 프로세스와 메모리 공간을 공유하다가 write를 하면 그 때 부모 프로세스의 메모리 공간의 일부를 copy하여 할당받는 COW(Copy-On-Write)라는 기법을 사용한다.
하지만 Memory Commit을 하지 않고 바로 물리 메모리를 할당하게 된다면 이런 COW와 같은 기술도 사용할 수 없기 때문에 바로 Memory Commit이 필요한 것이다.
그렇다면 VIRT는 실제로 사용하지 않는 영역이기 때문에 무한대로 할당 받을 수 있을까?
vm.overcommit_memory 파라미터를 통해 그렇게 할 수도, 그렇게 하지 못하게 막을 수도 있다.
vm.overcommit_memory 파라미터는 /proc/sys/vm/overcommit_memory에서 설정할 수 있으며, 아래와 같이 3가지 값으로 설정할 수 있다.
- 0: 기본 값으로, heuristic하게 overcommit을 허용
- 1: 항상 overcommit을 허용
- 2: 제한적으로 overcommit을 허용
4. S
S(Process Status)는 프로세스의 상태를 의미하며, 아래와 같이 5가지 상태로 나뉜다.
- D(uninterruptible sleep): 디스크 혹은 네트워크 디바이스에 요청을 보낸 후, 그에 대한 응답을 기다리는 프로세스
- R(runnig): CPU 자원을 소모하고 있는 실행 중인 프로세스
- S(sleeping): 시스템 콜 등을 호출해서 타이머를 작동시키거나, 콘솔 입력을 기다리는 프로세스
- T(traced or stopped): strace 등으로 프로세스의 시스템 콜을 추적하고 있는 상태
- Z(zombie): 부모 프로세스가 죽은 자식 프로세스
S 상태의 프로세스가 많은 것은 시스템에 큰 영향을 끼치지 않지만, D 상태의 프로세스가 많으면 특정 요청이 끝난 후에 R 상태로 다시 돌아갈 프로세스가 많다는 뜻이기 때문에 시스템의 부하를 계산하는 데 포함된다.
Z 상태는 부모 프로세스가 죽었는데도 자식 프로세스가 남아 있거나, 자식 프로세스가 죽기 전에 비정상적인 동작으로 부모 프로세스가 죽는 경우에 만들어진 좀비 프로세스를 의미한다.
좀비 프로세스는 이미 사용이 중지된 프로세스이기 때문에 메모리를 사용하지 않지만, PID를 점유하고 있기 때문에 Z 상태의 프로세스가 쌓이면 새로운 프로세스에 PID를 할당하지 못하는 PID 고갈을 일으킬 수 있다.
5. %CPU, %MEM
%CPU는 task의 CPU 사용율이며, %MEM은 task의 물리 메모리 사용율이다.
6. TIME+ , COMMAND
TIME+는 CPU가 task를 처리하는데 걸린 시간이며, COMMAND는 task를 시작하는 데 사용된 명령줄이나 연결된 프로그램의 이름이다.
[참고 문서]
https://linux.die.net/man/1/top
https://en.wikipedia.org/wiki/Copy-on-write
'LINUX > Advanced' 카테고리의 다른 글
[Linux] [CentOS] Load Average (0) | 2022.12.10 |
---|---|
[Linux] [CentOS] 시스템 구성 정보 확인 (3) | 2022.10.26 |
[Linux] netfilter와 iptables (1) | 2022.10.03 |
[Linux] [CentOS] vmcore 분석 (0) | 2022.09.24 |
[Linux] [CentOS] Jumbo Frame (0) | 2022.09.18 |