Linux Top 명령어

리눅스에서 프로세스 정보를 살펴 볼 수 있는 top 명령어에 대해 다뤄보고자 한다.

top

  • top = table of processes
  • $ top -b -n 1 실행 결과
    • 옵션없이 top실행 시 interval(디폴트 3초)을 두고 refresh
    • -b : batch mode. 더 이상 인풋을 받지 않고 해당 순간의 top를 출력

image-20210421022237221

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

프로세스 우선순위

  • 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

Leave a comment