ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Linux Swap 영역 정리
    커널(Kernel) 2022. 12. 4. 20:50

     

    환경 정보

    OS: ubuntu18.04 

    K8S를 사용 중인 환경이지만 swapon 환경이다. 

     

     

    Swap 영역

    swap 영역은 물리 메모리가 부족할 경우를 대비해서 만들어놓은 비상용 공간이다.  

    디스크의 일부를 사용하기 때문에 물리 메모리에 비해 접근과 처리속도가 떨어지므로 시스템 성능 저하를 일으킨다. 

     

    free 커맨드를 통해서 메모리 영역과 swap 영역을 함께 확인할 수 있다. 

     

    현재 2GB의 스왑 영역을 확보하고 있으며, 전혀 사용하고 있지 않다.

    스왑 영역을 사용하고 있다면 메모리와 관련해서 시스템에 문제가 있을 수 있다는 의미이다.

    따라서 스왑 영역을 사용하고 있는 프로세스를 확인해볼 필요가 있다. 

    서비스 용도가 아닌 관리 용도의 프로세스에서 메모리 누수가 있어, 스왑 영역을 사용하게 되었을 수도 있기 때문이다. 

     

    프로세스가 사용하고 있는 swap 영역은 다음과 같이 확인할 수 있다. 

    /proc/[process id]/smaps에서 확인할 수 있다.

    논리 메모리 00400000에서 039a4000에서 약 54MB만큼의 메모리를 사용하고 있고, 스왑 메모리는 사용 중이지 않다.

     

    프로세스 별로 사용중인 스왑 공간을 확인하고 싶다면, smem 유틸리티를 사용할 수 있다. 

     

     

    버디 시스템

    커널은 버디 시스템을 통해서 프로세스에 메모리를 할당한다. 

    버디 시스템이란 커널이 프로세스의 요청에 더 빠르게 응답하기 위해 물리 메모리를 연속된 페이지 영역으로 관리하는 방식이다.  

     

    예를 들어 연속 1개로 이루어진 페이지 버디, 연속 2개로 이루어진 페이지 버디 등이 있어서  

    프로세스가 8KB를 요구하면 커널은 연속 2개로 이루어진 페이지 버디를 내어주는 방식으로 동작한다. 

     

    다음은 시스템이 관리하는 버디 시스템 정보이다. 

     

    좌측부터 버디 시스템이 가지고 있는 1개, 2개, 4개...로 이루어진 페이지 영역의 개수를 의미한다. 

     

     

    메모리 재할당 과정

    메모리 재할당은 크게 두가지로 구분된다. 

     

    1. 커널이 사용하는 캐시 메모리 재할당

    커널은 시스템 성능을 높이기 위해서 페이지 캐시, 버퍼 캐시 등을 사용하는데  

    프로세스가 서비스하기 위해 메모리 할당이 필요한 경우

    캐시 메모리를 해제하고, 해제된 메모리를 가용 메모리 영역으로 돌려 프로세스에게 할당한다. 

     

    2. swap을 사용하는 재할당

    캐시 영역 메모리를 해제하고도 더 이상 프로세스에게 할당할 메모리가 없는 경우

    swap 메모리를 사용한다(커널 파라미터를 통해서 바로 스왑 메모리에 할당하도록 설정할 수도 있다). 

     

    Inactive 리스트에 있는 프로세스 메모리 영역을 골라 swap 영역에 적재하고(swap out)

    해당 메모리 영역을 해제하여 다른 프로세스에게 할당한다. 

     

    만약 스왑된 영역의 메모리를 참조해야 한다면, swap영역에서 메모리로 불러들여(swap in) 참조하도록 한다.  

    이렇게 swapping을 발생시키는 과정은  디스크를 거쳐야 하므로 시스템의 성능은 떨어질 수밖에 없다. 

     

     

    커널 파라미터

    1. vm.swappiness  

    커널이 메모리 영역을 스왑 영역으로 얼마나 옮길지 결정하는 파라미터로 디폴트가 60이다. 

    값이 커지면 캐시를 비우지 않고 스왑 영역에 할당하려는 경향이 커지고, 

    값이 작아지면 캐시를 먼저 비우려고 한다. 

     

    2. vm.vfs_cache_pressure

    커널이 메모리를 재할당할 때 페이지 캐시보다 디렉터리나 inode 캐시를 재할당하는 경향을 조절한다. 

    default는 100으로 값이 커질수록 inode 캐시, dentry 캐시를 더 많이 재할당한다. 

     

     

     메모리를 증설해야하는 Case

    스왑 영역을 사용해서 시스템 성능이 떨어지는 경우, 메모리를 증설해야 할까?

    프로세스가 서비스를 제공하기 위해 사용하는 메모리 양이 부족하여 swap 영역을 사용한다면 증설하면 좋다.

     

    하지만 메모리 해제가 발생하지 않아 메모리 누수가 생긴 경우라면 아니다.

    메모리 사용량이 선형적으로 증가하게 되는 경우, 이때 메모리 누수를 의심할 수 있는데,

    이 때는 gdb를 통해서 메모리 덤프를 생성하고 메모리 사용량을 확인하여 어떤 메모리 영역이 해제되지 않았는지 확인할 수 있다.

     

     

    Reference

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

    반응형

    댓글

Designed by Tistory.