본문 바로가기

메모리 영역 본문

Infra

메모리 영역

겨울바람_ 2025. 2. 6. 21:46

buffers와 cached 영역

커널은 디스크로부터 데이터를 읽거나 사용자의 데이터를 디스크에 저장한다.

 

하지만 디스크는 매우 느리고 I/O에 상당한 시간이 소요되기 때문에 커널은 디스크에 대한 요청을 빠르게 하기 위해 메모리의 일부를 디스크 요청에 대한 캐싱 영역으로 할당한다.

 

이때 커널이 디스크 캐싱을 위해 할당한 영역을 bufferscached라고 부른다.

커널이 읽어야 할 데이터가 파일의 내용이라면 커널은 bio 구조체를 생성하고 해당 구조체에 Page Cache 용도로 할당한 메모리 영역을 연결해준다. bio 구조체는 디바이스 드라이버와 통신하여 디스크로부터 데이터를 읽어 Page Cache에 파일의 내용을 채운다.

 

super_block, inode_block처럼 파일의 내용이 아닌 파일 시스템을 관리하기 위한 메타 데이터를 읽어올 때는 _get_blk()같은 내부 함수를 통해 블록 디바이스와 직접 통신한다. 그리고 가져온 데이터를 읽어 Buffer Cache에 저장한다.

 

즉, cached는 파일의 내용을 저장하고 있는 캐시, buffers는 메타 데이터를 담고 있는 캐시라고 할 수 있다.

free 명령어를 통해 각각의 영역을 얼마나 사용하고 있는지 확인할 수 있다.

 

bufferscached 영역은 시스템의 I/O 성능 향상을 위해 커널이 사용하는 영역이지만, 프로세스의 사용량이 많아져 메모리가 부족한 상황이 되면 커널은 해당 영역을 자동으로 반환하기 때문에 free 명령에서도 해당 영역을 제외한 영역을 실제 사용 가능한 영역으로 계산하게 된다.

/proc/meminfo

free 명령어를 통해서도 메모리의 사용량을 확인할 수 있지만, 대략적인 정보만 확인이 가능하다.

현재 메모리의 사용량을 좀 더 세부적으로 확인하고 싶다면 /proc/meminfo를 통해서 free보다 더 많은 정보를 파악할 수 있다.

 

/proc/meminfo를 통해 파악할 수 있는 정보는 커널의 버전마다 다르지만 공통적으로 나타내는 부분이 존재한다.

  • SwapCached : swap으로 빠진 영역 중 다시 메모리로 돌아온 영역을 의미한다.

  • Active (anon) : Page Cache 영역을 제외한 메모리 영역을 의미하며, 주로 프로세스들이 사용하는 메모리 영역을 지칭할 때 많이 사용된다. 그중에서도 비교적 최근에 메모리 영역이 참조되어 swap 영역으로 이동되지 않을 메모리 영역을 의미한다.
  • Inactivce (anon) : Active (anon)과 같은 영역을 의미하지만, 비교적 참조된 지 오래되어 swap 영역으로 이동될 수 있는 메모리 영역을 의미한다.
  • Active (file) : anon과 다르게 파일로 되어있는 이영역은 커널이 I/O 성능 향상을 위해 사용하는 영역을 의미한다. bufferscached 영역이 여기에 속한다. 그중에서도 비교적 최근에 메모리 영역이 참조되어 swap 영역으로 이동되지 않을 메모리 영역을 의미한다.
  • Inactive (file) : Active (file)과 같은 영역을 의미하지만, 비교적 참조된 지 오래되어 swap 영역으로 이동될 수 있는 메모리 영역을 의미한다.

Active 영역에서 Inactive 영역으로 이동하는 시기

anonfile 영역의 메모리는 LRU 기반의 리스트로 관리되고, 각기 Active, Inactive 두 개의 리스트로 나뉜다.

가장 최근에 참조한 메모리가 Active 리스트로 참조 시기가 오래될수록 Inactive 리스트로 이동하고 이후 free 영역으로 이동하게 된다. free 영역의 최소 메모리 양을 결정하는 커널 파라미터로는 vm.min_free_kbytes가 존재한다.

하지만 시간이 지났다고 무조건 이동하는게 아니라 메모리 부족 현상이 발생해서 해제해야 할 메모리를 찾아야 할 때만 이동이 발생하게 된다.

  • Dirty : Active (file), Inactive (file)과 비슷한 용도다. 커널은 I/O 쓰기 요청이 발생했을 때 바로 블록 디바이스로 명령을 내리지 않고 일정량이 될 때까지 모았다가 한 번이 쓰는 일종의 지연 쓰기 작업을 한다. 이 과정에서 I/O 성능 향상을 위해 커널이 캐시 목적으로 사용하는 영역 중 쓰기 작업이 이루어져서 실제 블록 디바이스의 블록에 씌어져야 할 영역을 의미한다.slab 메모리 영역slab 메모리 영역은 커널이 내부적으로 사용하는 영역이다. /proc/meminfo로 확인할 수 있는 영역 중 slab 항목이 존재한다.

  • slab : 커널이 직접 사용하는 메모리 영역
  • SReclaimable : slab 영역 중 재사용될 수 있는 영역으로 캐시 용도로 사용되는 메모리가 주로 포함된다. 메모리 부족 현상이 발생하면 해제되어 프로세스에 할당될 수 있는 영역
  • SUnreclaime : slab 영역 중 커널이 현재 사용 중이기 때문에 해제해서 재사용될 수 없는 영역

slab 영역에 대한 자세한 정보는 slabtop 명령어를 통해 알아볼 수 있다.

커널은 많은 용량의 메모리를 필요로하지 않기 때문에 메모리를 할당해주는 버디 시스템이 제공하는 4KB 보다 더 작은 양의 메모리를 Slab 할당자를 통해 확보한다.

 

메모리의 기본 단위인 4KB의 영역을 Slab 할당자가 할당 받은 후 목적별로 나뉘어진 캐시의 크기에 맞게 영역을 나누어 사용한다. 이 경우 종종 페이지 크기의 배수로 나누어 떨어지지 않는 경우도 존재한다.

swap 메모리 영역

swap 메모리는 물리 메모리가 부족할 경우를 대비해서 만든 영역으로, 시스템이 응답 불가 상태에 빠지지 않고 안정적으로 운영될 수 있도록 비상용으로 확보해둔 영역이라고 생각하면 된다.

 

물리 메모리가 아닌 디스크의 일부를 메모리처럼 사용하기 위해 만들어 놓은 공간이기 때문에 메모리의 접근 속도와 꽤 현저한 차이가 존재한다. 따라서 swap 메모리를 사용하게 되는 경우 시스템의 성능 저하가 발생하게 된다.

 

swap에 대한 정보는 free 명령어를 통해 확인할 수 있다.

 

불필요한 프로세스가 메모리를 점유하고 있는 경우 해당 프로세스를 죽여서 메모리를 확보하는 것이 좋다. 이때 프로세스가 사용하는 메모리에 대한 정보를 확인할 수 있는 방법이 /proc/<pid>/smaps 파일이다.

 

해당 파일은 프로세스가 사용 중인 메모리의 정보를 저장하고 있다.


하지만 이 방법은 프로세스의 메모리 영역별로 살펴봐야 하기 때문에 불편할 수도 있다. 특정 프로세스가 사용하는 전체 swap 메모리에 대한 정보가 필요한 경우에는 /proc/<pid>/status 파일을 통해 확인할 수 있다.

Comments