메모리 영역 본문
buffers와 cached 영역
커널은 디스크로부터 데이터를 읽거나 사용자의 데이터를 디스크에 저장한다.
하지만 디스크는 매우 느리고 I/O에 상당한 시간이 소요되기 때문에 커널은 디스크에 대한 요청을 빠르게 하기 위해 메모리의 일부를 디스크 요청에 대한 캐싱 영역으로 할당한다.
이때 커널이 디스크 캐싱을 위해 할당한 영역을 buffers
와 cached
라고 부른다.
커널이 읽어야 할 데이터가 파일의 내용이라면 커널은 bio
구조체를 생성하고 해당 구조체에 Page Cache 용도로 할당한 메모리 영역을 연결해준다. bio
구조체는 디바이스 드라이버와 통신하여 디스크로부터 데이터를 읽어 Page Cache에 파일의 내용을 채운다.
super_block
, inode_block
처럼 파일의 내용이 아닌 파일 시스템을 관리하기 위한 메타 데이터를 읽어올 때는 _get_blk()
같은 내부 함수를 통해 블록 디바이스와 직접 통신한다. 그리고 가져온 데이터를 읽어 Buffer Cache에 저장한다.
즉, cached
는 파일의 내용을 저장하고 있는 캐시, buffers
는 메타 데이터를 담고 있는 캐시라고 할 수 있다.
free
명령어를 통해 각각의 영역을 얼마나 사용하고 있는지 확인할 수 있다.
buffers
와 cached
영역은 시스템의 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 성능 향상을 위해 사용하는 영역을 의미한다.buffers
와cached
영역이 여기에 속한다. 그중에서도 비교적 최근에 메모리 영역이 참조되어swap
영역으로 이동되지 않을 메모리 영역을 의미한다. - Inactive (file) : Active (file)과 같은 영역을 의미하지만, 비교적 참조된 지 오래되어
swap
영역으로 이동될 수 있는 메모리 영역을 의미한다.
Active 영역에서 Inactive 영역으로 이동하는 시기
anon
과file
영역의 메모리는 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
파일을 통해 확인할 수 있다.
'Infra' 카테고리의 다른 글
[k8s] NodePort, LoadBalancer, Ingress (2) | 2024.11.12 |
---|---|
[k8s] k8s Security basic (0) | 2024.11.11 |
[k8s] Kubernetes Network (0) | 2024.11.08 |
[Traefik] K8s Traefik 설치, External-IP 설정 및 HTTPS 적용 방법 (5) | 2024.09.22 |
[k8s] K8s Storage with OpenEBS (0) | 2024.08.02 |