ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Linux Top으로 확인할 수 있는 정보들
    커널(Kernel) 2022. 11. 21. 19:15

     

    환경 정보

    OS: ubuntu18.04 

     

     

    Top을 통해서 확인할 수 있는 정보들  

    top을 옵션 없이 사용하면, 3초마다 갱신된다. 

    특정 순간의 사용량을 보고 싶을 때는 -b 옵션을 사용한다. 

    위 이미지에서 다음과 같은 정보를 확인할 수 있다. 

    • 서버를 구동한지 19일 되었다. 
    • 3명의 사용자가 접속해있다. 
    • 현재 461개의 프로세스가 구동되고 있다. 
    • CPU, memory, swap 사용량을 확인할 수 있다. 
    • 프로세스 정보들
      • PR은 priority를 의미한다.(낮을 수록 우선순위가 높다)
      • NI은 PR을 조절할 때 사용한다. 
      • VIRT: 가상 메모리 사용량 
      • RES: 물리 메모리 사용량 
      • SHR: 프로세스끼리 메모리를 공유하는 양
        • glibc를 예로 들 수 있는데, 대부분의 프로세스들은 glibc 라이브러리를 참조하기 때문에 프로세스마다 glibc를 메모리에 올려서 사용하는 것은 낭비다. 따라서 시스템은 다수의 프로세스가 사용하는 라이브러리를 공유 메모리 영역에 올려 함께 사용하도록 설계되었다. 
    • 프로세스의 상태 정보(D, R, S, T, Z)

     

     

    프로세스 상태 정보 

    D = uninterrupted sleep

    디스크 혹은 네트워크 I/O를 기다리는 상태 

     

    R = Running

    실행 중인 프로세스

    CPU를 소모하고 있음 

     

    S = sleeping 

    사용자 입력을 기다리는 상태 

     

    T = traced or stopped

    strace 등으로 프로세스의 시스템 콜을 추적하고 있는 상태 

     

    Z = zombie

    부모 프로세스가 죽은 자식 프로세스 

     

    책에서는 zombie 프로세스를 부모 프로세스가 죽은 자식 프로세스로 표현하고 있는데,

    내가 알고 있는 부분과 조금 다른 것 같아서 알아보니 좀비 프로세스는 자식 프로세스가 죽은 상태에서, 부모 프로세스가 리소스를 회수하기 전 상태를 의미하는 듯하다.

     

    아무튼 좀비 프로세스는 시스템 리소스를 차지하고 있지는 않지만, 해당 프로세스가 PID를 점유하므로 문제가 될 수 있다. 

     

     

    프로세스 우선순위

    CPU마다 Rune queue가 존재하며, 우선순위 별로 프로세스가 연결되어 있다.

    스케줄러는 현재 Run queue에 있는 프로세스들 중 가장 우선순위가 높은 프로세스를 꺼내서 dispatcher에게 넘겨준다. 

    dispatcher는 현재 실행 중인 프로세스의 정보를 다른곳에 저장한 후 넘겨받은 프로세스의 정보를 가지고 다시 연산하도록 요청한다. 

     

     

    참고.

    최대 PID 확인하기

     

    Memory Commit

    프로세스가 커널에 필요한 메모리(가상 메모리) 만큼을 요청하고, 커널은 사용가능한 메모리(물리 메모리) 영역을 프로세스에게 할당해준다.

    하지만 실제로 할당은 하지 않으며, 해당 영역을 주었다는것을 저장하는 이 과정이 메모리 커밋이다.

     

    메모리 커밋을 사용하는 이유

    만약 메모리 커밋이 없다면 메모리가 미리 할당되어, 메모리 낭비가 발생할 수 있다. 

    보통은 fork() => exec() => COW가 발생한 시점부터 실질적인 메모리 할당이 시작된다. 

     

    vm.overcommit_memory 

    커널은 vm.overcommit_memory 파라미터를 통해서 메모리 커밋 동작을 제어한다. 

     

    vm.overcommit_memory는 0(디폴트), 1, 2로 세팅 가능하다. 

    0 : overcommit 할 수 잇는 최대값은 page cache + swap + slab reclaimable가 된다. 

    1 : 아무것도 계산하지 않고, 모든 메모리에 대해 commit할 수 있다.  

    2 : 제한적으로 커밋을 진행한다. vm.overcommit_ratio에 설정된 비율과 swap 영역의 크기를 토대로 계산한다. 

     

    또한 vm.overcommit_memory를 이용하면 프로세스에 할당되는 가상 메모리 양도 제한할 수 있다. 

     

     

    Memory OverCommit

    프로세스가 커널에게 메모리를 요청했을 때, 요구된 메모리의 총량이 실제 OS가 가지고 있는 메모리 총량보다 많더라도 실제 메모리가 부족해지기 전까지는 프로세스의 동작을 허가한다. 

    결과적으로 요구한 메모리 총량이 %commit 이 100%를 넘는 경우가 발생하고 이를 오버커밋이라 부른다.

    이러한 기능 덕분에 Linux에서는 메모리 낭비를 줄일 수 있다. 

    하지만 동작중인 프로세스가 실제 대량으로 메모리를 사용하여 실제 메모리 총량을 넘어서는 경우,

    OOM-Killer가 중요도가 떨어지거나 사용하지 않는 프로세스를 kill하여 메모리를 확보한다.

     

     

    Reference

    Devops와 SE를 위한 리눅스 커널 이야기 

    https://hakkyoonjung31.github.io/linux/memory-overcommit/

    반응형

    댓글

Designed by Tistory.