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 strace  (0) 2018.08.08
Linux Memory 재할당  (0) 2018.08.08
Linux rsync  (0) 2018.08.08

+ Recent posts