Linux I/O cache
Page Cache
리눅스는 I/O 성능을 높이기 위해서 Page cache — cached를 사용한다.
또 파일 시스템의 메타데이터와 관련된 블록들을 저장하기 위해 Buffered cache — buffered를 사용한다.
기본적인 동작 원리는 아래와 같다.
물리적인 저장/통신 장치와의 데이터를 주고받을 때 메모리에 먼저 적재 한다. 그리고 데이터를 주고 받는다. 동일한 데이터에 대한 접근이 일어 날 때는 메모리에서 바로 가져오도록 한다.
Slab — 커널 캐시
일종의 자원 할당자 중 하나로 4kb의 크기를 가진 page로 데이터를 저장하고 관리할 경우 발생하는 단편화를 최소화 하기 위해 고안된 물건이다.
리눅스 커널은 자료구조로 slab을 사용하고 있으며 /proc/meminfo 에서 slab 항목을 보면 리눅스 커널이 사용하는 캐시 크기를 알 수 있다.
어떤 파일을 생성할 때 파일의 정보를 담고 있는 inode와 dentry는 빠르게 접근하기 위해 커널의 slab 자료구조에 추가 된다.
즉 빈번한 파일 생성 삭제를 하게 되면 커널 캐시를 많이 쓰게 된다.
slabtop 이라는 명령어로 inode와 dentry 캐시의 현재 크기를 확인 가능하다.
vf_cache_pressure : 커널 파라미터. 디렉토리와 inode 오브젝트에 대한 캐시로 사용된 메모리를 반환하는 경향의 정도를 지정할 수 있다.
0이면 반환 안하고 100이상은 가급적 반환 하려고 한다.
echo 10000 > /proc/sys/vm/vfs_cache_pressure
sysctl vm.vfs_cache_pressure=10000
추가적인 팁
앞서 vfs_cache_pressure를 통해서 Linux 커널의 VFS 관련 오브젝트 캐시경향을 조절하는 방법외에도 이러한 정책을 세워서 효과를 보기보다 지금 당장 캐시를 비우기만 하고 싶을 때는 아래와 같은 방법이 있다.
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
각각의 숫자 값은 아래와 같은 의미를 가지고 있으며 해당 값이 설정되면 영구적으로 지속되는 것이 아니라 값이 설정되는 순간만 그 값에 따라서 반영 될 뿐이다.
주의 : 아래 명령을 수행하기 전에 반드시 sync 등을 통해서 캐시에 휘발성으로 담긴 데이터를 실제 저장 장치에 반영시키도록 해야 한다.
- drop_caches = 1
- Page cache를 해제 한다.
- drop_caches = 2
- inode, dentry cache를 해제 한다.
- drop_caches = 3
- Page cache, inode cache, dentry cache를 모두 해제 한다.