ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Linux 메모리 정리(buffer, cache, Active/Inactive, slab)
    커널(Kernel) 2022. 11. 28. 00:16

     

    환경 정보

    OS: ubuntu18.04

    swap: off  

     

     

    메모리 사용량 확인하기 

    free -m 사용시 MB 단위로 메모리 사용량을 확인할 수 있다 .

     

    total : 시스템의 전체 메모리 양

    used : 사용하고 있는 메모리 양

    free : 아무도 사용하고 있지 않는 시스템 메모리 양
    shared : 프로세스 사이에서 공유하고 있는 메모리 양. ex) glibc

    buff : 버퍼를 사용하고 있는 메모리양으로 프로세스가 사용하는 메모리 영역은 아니다. 시스템 성능 향상을 위해서 커널에서 사용하는 메모리 양 

    cache : 페이지 캐시. I/O 관련 작업을 빠르게 진행하기 위해서 커널에서 사용하는 메모리 양

    swap : swap 영역에 대한 정보

     

     

    buffer와 cache

    디스크는 커널에 비해 매우 느리기 때문에 디스크와 관련된 요청을 빠르게 처리하기 위해서는 캐시를 사용해야 한다.  

    그리고 이 때 사용하는 캐시 영역이 buffer와 cache다. 

     

    cache 영역은 page cache를 의미하여 file의 내용들을 저장하며, 

    buffer 영역의 경우에는 파일 시스템의 메타 데이터를 저장하는 buffer cache를 의미한다. 

     

     

    메모리 사용 흐름

    1. 프로세스가 처음 메모리를 사용하는 시점에는 가용영역을 캐시로 사용하지 않는다.  

    2. 시간이 흐르면서 시스템의 성능을 높이기 위해 가용영역의 일부를 캐시로 사용하기 시작한다.

    3. 프로세스가 메모리를 사용하는 영역이 너무 커져 일정 수준 이상 되면 사용하던 캐시 영역을 다른 애플리케이션이 사용할 수 있도록 메모리 관리시스템에게 반환한다.  

    4. 물리 메모리만으로 프로세스가 사용하는 메모리 영역을 감당할 수 없을 때, 스왑 영역을 사용하게 된다. 스왑 영역을 사용하게 되면 시스템 성능이 감소한다. 

     

     

    Active 영역과 Inactive 영역 

    /proc/meminfo 경로를 확인해보면 다양한 memory 영역을 확인할 수 있다. 

     

    swapCached : 메모리 부족해지면 해당 영역이 swap으로 이동하고, 메모리에 여유가 생기면 swap영역에 있던 부분이 메모리로 돌아간다. 이때 스왑 영역에 남아 있던 메모리 영역은 지워지지 않고 남아 있는데 이를 swapCached 영역이라 한다. 

    Active(anon) : 페이지 캐시를 제외한 프로세스가 사용하는 메모리 영역. 비교적 최근에 메모리 영역이 참조되어 swap 영역으로 이동되지 않을 메모리 영역

    Inactive(anon) : 페이지 캐시를 제외한 프로세스가 사용하는 메모리 영역. 참조된지 오래된 메모리 영역으로 swap 영역으로 이동될 수 있는 메모리 영역

    Active(file) : 커널이 I/O 향상을 위해서 사용하는 영역 buffer와 cached가 여기 포함. 비교적 최근에 메모리 영역이 참조되어 swap 영역으로 이동되지 않을 메모리 영역

    Inactive(file) : 커널이 I/O 향상을 위해서 사용하는 영역 buffer와 cached가 여기 포함. 참조된지 오래된 메모리 영역으로 swap 영역으로 이동될 수 있는 메모리 영역

    Dirty: I/O 성능 향상을 위해서 커널이 저장한 캐시 영역 중 쓰기 작업이 이루어져 실제 블록 디바이스에 쓰여져야할 영역. 

    커널은 기본적으로 I/O 쓰기 요청이 발생했을 때 바로 블록 디바이스에 명령을 내리지 않고, 모아서 한번에 처리한다. 

     

     

    Active 영역과 Inactive 영역을 구분하는 방법

    LRU(Least Recently Used) 기반의 리스트로 관리되며 자주 사용되는 영역이 Active List에 남게되고

    참조시기가 오래될수록 Inactive 영역으로 이동한다. 이후에도 참조되지 않는다면 free영역으로 이동한다.  

     

     

    Active 리스트와 Inactive 리스트 사이의 이동

    1. 프로세스가 메모리 할당을 요청

    2. 할당된 메모리의 페이지가 Active 리스트에 연결

    3. 메모리 할당이 실패하거나 부족하게되면 Active 리스트에 있던 페이지가 Inactive 리스트로 이동 

    4. Inactive 리스트에 있던 페이지가 해제되어 다른 프로세스에게 할당 

     

     

    slab 메모리 영역

    커널이 필요한 작업을 하기 위해서는 마찬가지로 메모리가 필요하다. 

    하지만 버디 시스템이 제공하는 페이지 크기가 4kb이므로 커널이 사용하기에는 너무 크다.

    그래서 커널은 더 작고 효율적인 구조의 slab 메모리 영역을 사용한다. 

     

    slab은 각각의 목적에 맞는 캐시별로 영역을 할당받아 사용한다. 

    slabtop으로 본 slab에서 사용하는 캐시메모리

    버디 시스템을 통해서 페이지 크기가 4kb인 영역을 할당 받은 후

    각각의 캐시의 크기에 맞게 영역을 나누어 사용하는데, slab 영역중 가장 많이 사용되는 cache는 주로 dentry와 inode이다. 

     

    slab 영역을 자세히 확인해보면 

     

    slab : 커널이 직접 사용하는 메모리 영역. dentry cache, inode cache 등 커널이 사용하는 메모리가 포함.

     

    SReclaimable : slab 영역 중 재사용될 수 있는 영역. 캐시 용도로 사용하는 메모리들이 포함되어 있으며 메모리 부족이 발생하면 해제될 수 있는 있음 

     

    SUnreclaim : slab 영역 중 재사용될 수 없는 영역. 커널이 현재 사용중인 영역으로 해제될 수 없는 없음

     

     

    Reference

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

    반응형

    댓글

Designed by Tistory.