Linux Top 명령어
리눅스에서 프로세스 정보를 살펴 볼 수 있는 top 명령어에 대해 다뤄보고자 한다.
top
- top = table of processes
$ top -b -n 1
실행 결과- 옵션없이
top
실행 시 interval(디폴트 3초)을 두고 refresh - -b : batch mode. 더 이상 인풋을 받지 않고 해당 순간의 top를 출력
- 옵션없이
top 출력 결과중에서 이 포스트에서 자세히 살펴볼 부분은 빨간색 박스로 표시한 부분이다.
-
Cpu, Mem, Swap : 하드웨어 리소스 사용량
-
PR, NI : 프로세스 우선순위
-
VIRT, RES, SHR : 프로세스가 사용하는 메모리 사용량
-
S : 프로세스 상태
프로세스의 메모리
VIRT
-
프로세스가 사용하고 있는 virtual memory 전체 용량
- 커도 문제되지 않음
- Memory commit : 예약을 했을 뿐 실제로 할당을 하진 않음
RES
-
현재 프로세스가 사용하고 있는 물리 메모리양
- 이 부분이 메모리 사용과 관련해서 실제로 중요한 부분
- 이게 높은 걸 찾아야 실제 메모리 점유율이 높은 프로세스를 찾을 수 있다.
SHR
-
다른 프로세스와 공유하는 shared memory 양
-
ex) 리눅스 glibc 라이브러리 - 대부분의 리눅스 프로세스가 참조하는 라이브러리
Memory commit
-
프로세스가 커널에 필요한 메모리를 요청하면, 커널이 사용가능한 메모리 영역을 주고 해당 영역을 프로세스에 주었다는 것을 저장해두는 과정. 이때, 실제 할당이 일어나지 않음
- Lazy. 실제로 사용할 때 page fault 발생하여 그 때서야 물리 메모리에 binding되어 RES에 포함
- Why lazy?
- 가장 큰 이유는 fork() 때문
- 대부분 fork() 직후에 exec()을 실행하기 때문에 메모리 미리 할당해봐야 exec()을 바로 호출하면 쓸모없어진다.
- 이를 방지하기 위해 COW(Copy-on-write) 기법을 활용하고
- memory commit 방식이 없으면 COW도 불가능
sar -r
의%commit
: 시스템의 메모리 커밋 비율- 물리 메모리에 할당한 척만하고 실제 사용하지 않는 메모리 비율(전체 메모리 대비)
- = 물리 메모리에 할당될 가능성이 있는 비율 => 비율이 높으면 시스템 부하 가능
- 그렇다면, vm을 물리 메모리보다 더 많은 양만큼 overcommit하게 되는데 무한대로 할당받을 수 있는가? ==
vm.overcommit_memory
옵션에 따라 다름. vm.ovecommit_memory
- 0(default) : 요청 메모리가 Page Cache+Swap Memory+Slab Reclaimable보다 작을때 commit일어남. 현재 free memory 크기와 무관
- 1 : 무조건 commit
- 2 :
vm.overcommit_ratio
(물리 메모리에 대한 %, 기본값 50)의 비율 반영하여Swap memory+(물리메모리 크기 * vm.overcommit_ratio)
보다 작으면 commit. 이보다 크면 메모리 할당 거부하여 에러 발생 시킴(malloc()에서 null Return)
- 어찌되었든 overcommit을 지원하고 max값을 어떻게 결정하느냐가 다를 뿐.
프로세스 상태
- top의 S(Status)를 통해 확인
- 상태 종류
- D : uninterruptible sleep : I/O(디스크, 네트워크) 대기 중.
- Run queue에서 제거. Wait queue에 등록
- 이게 많으면 시스템에 영향. 왜냐면 다 R로 돌아갈 애들이기 때문에
- 따라서 시스템 부하 계산에 포함시킨다.
- R : ready-to-run
- run queue에 포함된 프로세스(running+waiting)
- 실제로 cpu 자원 소모 중인 프로세스
- S : (Interruptible) sleeping.
- S는 아무나 깨울 수 있지만, D는 해당 I/O 드라이버만 깨울 수 있다는 점에서 차이
- T : traced or stopped. strace 등으로 프로세스의 시스템 콜을 추적하고 있는 상태. 흔하지 않음
- Z : zombie. 부모 프로세스가 먼저 죽었을 때 남겨진 자식 프로세스. 부모가 회수를 못하기 때문에 문제
- CPU나 메모리를 사용하지 않음.
- 그럼 왜 문제? pid가 정리되지 않은 채로 쌓여서 pid 고갈 문제 발생
- cf) pid 최댓값 =
kernel.pid_max
- D : uninterruptible sleep : I/O(디스크, 네트워크) 대기 중.
프로세스 우선순위
- PR, NI을 통해 확인
- PR: priority. 스케줄러가 활용하는 실제 우선순위값. 값이 작을수록 우선순위 높다
- 유저 프로세스의 경우
PR = 디폴트 우선순위+nice value
- 유저 프로세스의 경우
- NI : nice value. 주로 우선순위를 높일때(값을 낮출때) 사용.
- 디폴트 우선순위 = 20
nice -n -10
와 같은 명령으로 우선순위를 낮출 수 있다.- 이때 코어수에 따라 의도대로 안될 수도 있다.
- 예를 들어 2-core인 경우 A 프로세스를 B 프로세스보다 먼저 실행시키고 싶어서 A프로세스의 nice 값을 10낮춘다고 해서 B프로세스보다 A프로세스가 우선하진 않는다(A,B가 병렬로 실행되기 때문에). 싱글코어에서는 가능
renice
등도 가능.- RT : Realtime
- 반드시 특정 시간 안에 종료되어야 하는 중요한 프로세스
- ex) 커널에서 사용하는 데몬
- 사용자 프로세스 아님
- RT 스케줄러가 따로 존재. CFS 스케줄러보다 먼저 실행됨
References
-
DevOps와 SE를 위한 리눅스 커널 이야기 2장 내용을 요약 정리한 것입니다. gitbook 링크
Leave a comment