DevOps - top을 통해 살펴보는 프로세스 정보들
2장 top을 통해 살펴보는 프로세스 정보들
# top : 시스템 상태를 빠르게 파악할 수 있는 명령어
2-1 시스템의 상태 살피기
# top 를 옵션 없이 입력하면 인터벌 간격으로 화면이 갱신되며 정보가 확인된다.
-b 옵션을 주면 순간의 top 정보를 확인할 수 있다.
상단에서 확인할 수 있는 정보로는 1) 서버의 시간과 구동 시간, 2) 로그인해 있는 사용자의 수,3) load average(현재 시스템이 얼마나 많은 일을 하고 있는지), 4) 시스템에서 구동 중인 프로세스 개수, 5) CPU Mem swap의 메모리 사용량 등이 있다.
하단에서 확인할 수 있는 정보로는 PID, 메모리 사용률, 상태, CPU 점유 시간 등이 있다.
*PR : 프로세스의 실행 우선 순위
*NI: PR을 얼만큼 조절할 것인지
*VIRT, RES,SHR : 프로세스가 사용하는 메모리의 양
*S : 프로세스 상태
2-2 VIRT, RES, SHR
VIRT : Task, 즉 프로세스에 할당된 가상 메모리 전체 크기
RES : 그 중에서 실제로 메모리에 올려서 사용하고 있는 물리 메모리의 크기 - 점유율이 높은 프로세스를 찾을 때 활용
SHR : 다른 프로세스와 공유하고 있는 메모리의 크기 ex) 라이브러리
2-3 VIRT, RES, Memory Commit
<Memeory Commit 동작 방식>
프로세스가 커널에 필요한 만큼의 메모리 요청 -> 커널은 프로세스에 사용 가능한 메모리 영역을 주고 실제로 할당은 하지 않지만 해당 영역을 프로세스에 주었다는것을 저장
프로세스 ---1GB의 메모리 요청--> 커널 (프로세스의 요청에 따라 영역을 할당하였으나 실제 물리 메모리에 할당 X)
커널 ---가상의 메모리 주소 전달--> 프로세스 ( 자신이 가진 영역이 1GB인 것으로 인식)
이후 프로세스가 할당 받은 메모리 영역에 실제로 쓰기 작업 -> Page falut 발생 -> 실제 물리 메모리에 프로세스의 가상 메모리 공간을 매핑 -> 물리 메모리에 바인딩된 영역이 RES로 저장
malloc() 실습
1) malloc()으로 메모리 요청을 한 후 아무것도 하지 않는 코드 -> (top로 확인) VIRT는 계속 높아지지만 RES는 늘어나지 않음
2) malloc()으로 메모리 요청 후 쓰기 코드 -> VIRT와 RES가 비슷한 비율로 늘어남
+ VIRT는 무한대로 늘어나는가 -> vm.overcommit_memory 파라미터에 따라 그렇게 할 수도, 그렇게 하지 못하게 막을 수도 있음
Memory Commit을 사용하는 이유 ( 왜 프로세스의 메모리 요청에 따라 즉시 할당하지 않는가)
fork()와 같은 새로운 프로세스를 만들기 위한 콜을 처리하기 위해 (+ COW 기술의 활용)
// fork()는 현재 실행 중인 프로세스와 동일한 프로세스를 하나 더 생성하는데 대부분은 fork() 후 exec()로 전혀 다른 프로세스로 변하기 때문에 대부분의 메모리 영역이 쓸모 없어질 수 있다. 이 때 COW(copy-on-write) 기법으로 복사된 메모리 영역에 실제 쓰기 작업이 발생한 후에 실질적인 메모리 할당이 시작된다.
Memory Commit 상태 확인
sar -r로 확인할 수 있으며 %commit 숫자로 시스템 메모리의 커밋 비율을 알 수 있다.
커밋된 메모리의 비율이 높다면 문제가 발생할 수 있으므로 커널은 커밋 동작 방식을 앞서 잠깐 언급했던vm.overcommit_memory라는 파라미터로 제어할 수 있게 해두었다.
값은 0,1,2 세 가지로 세팅할 수 있다.
0 : 커널에서 사용하는 기본 값
1: 무조건 commit 진행 (메모리 누수가 있는 프로세스가 있다면 시스템 응답 불가 현상 발생 가능)
2: 제한적 commit 진행
2-4 프로세스의 상태 보기
SHR 옆의 S 항목으로 확인할 수 있다.
D: uninterruptible sleep 상태로 디스크 혹은 네트워크 I/O 를 대기하고 있는 프로세스
R: 실행 중인 프로세스
S: sleeping 상태 프로세스 (D와의 차이점은 요청한 리소스를 즉시 사용할 수 있다는 점)
T: traced or stopped 상태로 프로세스의 시스템 콜을 추적하고 있는 상태
Z: zombie 상태의 프로세스. 부모 프로세스가 죽은 자식 프로세스 (PID 고갈을 일으킬 수 있음)
+uninterruptible sleep: 프로세스가 요청을 보낸 후 응답을 기다려야하는 상태 (D)
<-> interruptible sleep: sleep() 시스템 콜 등을 호출하여 타이머를 작동시키거나 콘솔 입력을 기다리는 상태 (S)
2-5 프로세스의 우선순위
PR: 커널에서 인식하는 해당 프로세스의 실제 우선순위 값
NI: nice 값이라고 부르며 nice 명령을 통해 PR 값을 낮출 수 있다. (값이 낮을수록 순위는 높다)
+nice로 우선순위를 낮췄다고 해도 CPU Core의 수와 동일한 수의 프로세스가 돌아가고 있다면 CPU 경합이 일어나지 않으므로 프로세스들은 비슷한 시간에 끝나게 된다.
PR에 rt 라는 값을 확인할 수 있는데 이는 real time 스케줄러로 반드시 특정 시간 안에 종료되어야하는 중요한 프로세스들, 커널에서 사용하는 데몬들이 대상이며 CFS 스케줄러보다 더 먼저 실행된다.