728x90
반응형
리눅스 커널은 기본적으로 메모리가 유휴 상태로 있는 것을 선호하지 않는다. 프로세스에 할당되어 있지 않은 메모리는 커널이 사용을 하고 커널은 이런 메모리를 주로 캐시용도로 사용한다.


- 캐시메모리 종류

1) page cache : 리눅스는 물리적인 저장/통신 장치와 데이터를 주고 받을 때 먼저 메모리에 적재한 후 데이터를 주고 받는데 나중에 동일한 데이터에 대한 접근을 할 경우 메모리에서 바로 가져오도록하여 I/O 성능을 높이기 위함이다. 이때 Page라는 단위로 관리하는데 이를 page cache라고 한다.

2) inode, dentry cache : 파일의 자료구조를 의미한다. 보다 빠른 데이터 접근을 위해 Slab의 자료구조에 추가되어 사용, dentry는 경로명 탐색을 위한 cache 역할도 수행


※ Slab

Slab Allocator라고 하며 일종의 자원 할당자 중 하나로 4KB의 크기를 가진 Page로 데이터를 저장하고 관리할 경우 발생하는 단편화를 최소화 하기 위해 만들어졌다.
리눅스 커널은 자료구조로 Slab을 사용하고 있으며 /proc/meminfo에서 리눅스 커널이 사용하는 cache크기(Slab : 349364KB) 를 의미한다.

리눅스 커널에서 커널과 디바이스 드라이버, 파일시스템 등은 영구적이지 않은 데이터(inode, task 구조체, 장치 구조체 등)들을 저장하기 위한 공간이 필요한데 이것이 Slab 구조하에 관리된다. /proc/meminfo에서 출력되는 Slab 값은 이러한 데이터들의 메모리상 크기를 의미하기 때문에 커널 cache라고 표현한다.






프로세스 메모리를 제외한 유휴 메모리가 없는 경우


프로세스가 사용하는 메모리를 제외한 남은 메모리는 /proc/meminfo 파일의 Slab에서 찾을 수 있다. Slab의 크기가 크다면 커널이 Slab 자료구조에 계속해서 cache 데이터로 담고 있다는 것이다. 이는 동작하고 있는 프로세스의 성격과 관련이 높다. 해당 프로세스의 주 작업 패턴이 특정 파일을 대량으로 생성하고 이 데이터를 가공처리하는 작업을 반복하며 작업과정에서 생성, 삭제되는 파일이 많을 경우이다.

리눅스 커널은 파일시스템의 성능을 나아가 시스템의 성능을 개선하기 위해 inode와 dentry를 메모리에 cache한다. 하지만 파일을 빈번하게 생성/삭제 하거나 대량의 파일을 다루는 시스템의 경우 해당 파일을 자주 재활용(생성/기록 후 데이터를 지속적으로 접근하여 읽음)하지 않는다면 cache에 메모리를 사용하기 보단 I/O를 위한 버퍼 또는 프로세스에 할당되어 활용하는 편이 더 좋다.

- Linux Slab 자료 구조의 상태를 살펴 볼 수 있는 명령어 : slabtop 
해당 명령어는 inode와 dentry cache의 현재 크기를 알 수 있다.



cache 메모리 반환


vfs_cache_pressure을 이용하여 리눅스 커널에게 cache 데이터를 반환하도록 한다.

- vfs_cache_pressure란?
리눅스 커널의 vm 구조와 관련된 파라미터로 vfs_cache_pressure라는 것이 존재한다. 이 파라미터는 inode 오브젝트에 대한 cache로 사용된 메모리를 반환하는 경향의 정도를 지정하는 항목이다. (기본값은 100)
이 값을 0으로 설정하게 되면 리눅스 커널은 오브젝트에 대한 cache를 반환하려고 하지 않을것이며 시스템은 OOM(Out of Memory) 상태가 발생한다.
▷ OOM : 프로세스의 메모리 크기가 특정 값 이상이 되면 kill 통해 시스템이 강제로 죽이는 기능
이 값을 100 이상으로 설정하면 리눅스 커널은 오브젝트에 대한 cache를 가급적 반환한다. (cache를 보관하려하지 않음) 이를 이용하면 inode와 dentry cache를 줄일 수 있다.

100이상의 값을 설정하면 되는데 10000 정도로 설정할 시 문제 없이 운영이 가능하다. 

# echo 10000 > /proc/sys/vm/vfs_cache_pressure
또는
# sysctl vm.vfs_cache_pressure=10000

영구적으로 설정하기 위해서는 /etc/sysctl.conf 파일에
vm.vfs_cache_pressure = 10000
으로 설정한다.

이러한 cache에 대해 정책을 세울 수도 있는데 해당 정책은 일시적인 휘발성 효과이다.

echo 1 > /proc/sys/vm/drop_caches => Page cache를 해제
echo 2 > /proc/sys/vm/drop_caches => inode, dentry cache를 해제
echo 3 > /proc/sys/vm/drop_caches => Page, inode, dentry cache 모두 해제

3번으로 설정할 시에는 시스템이 잠시 멈출수도 있다. 해당 명령을 실행전 cache에 있는 휘발성 데이터들을 sync 명령을 통해 저장장치에 반영시켜야 한다.




반응형

'Linux' 카테고리의 다른 글

Linux root Password 변경 (RHEL7)  (0) 2018.08.08
Linux nfs 설정  (0) 2018.08.08
Linux Memory Slab 관리  (0) 2018.08.08
Linux strace  (0) 2018.08.08
Linux Memory 재할당  (0) 2018.08.08
Linux rsync  (0) 2018.08.08

+ Recent posts