리눅스에서 free 명령어를 사용하다 보면 buffer/cache라는 것이 존재. 이 부분은 직접 사용하고 있는 메모리가 아닌 버퍼와 캐시에 사용된 메모리.
버퍼와 캐시에 저장된 메모리 말고 Swap 메모리도 있는데 해당 메모리는 메모리의 사용량이 늘어남에 따라서 디스크의 일부를 Ram처럼 사용할 수 있게 해주는 영영을 의미한다. (커널에서 실제 메모리에 올라와 있지 않는 블록중 쓰이지 않는 것을 디스크에 저장하여 사용 가능한 메모리 영역을 늘림)
일반적으로 캐시는 느린 장치의 데이터를 빠른 장치에 임시로 보관해두고 사용하여 성능을 올리는 것이 목적이다.
따라서 캐시는 당연히 사용하는 것이 좋지만, 적중률(hit 라고도함)이 낮은 캐시의 경우에는 캐시를 사용하는 것이 성능에 좋지 않을 수 있음.
리눅스에서는 기본적으로 디스크 상의 파일을 읽고 난 뒤 (I/O입출력) 닫아도 메모리가 모두 반환되지 않음.
그 이유는 파일의 정보를 다음 사용해 대비하여 cache 하기 때문.
대용량의 파일이 관리되는 서버는 캐시의 적중률이 낮게 되기 때문에 cache기능을 끄거나 주기적으로 캐시를 지워주어야 한다.
# aws EC2 에서 확인한 메모리 정보
$ free -h
total used free shared buff/cache avail
Mem: 486M 78M 297M 4.4M 110M 391M
Swap: 2.0G 0B 2.0G
[total]설치된 총 메모리의 크기 (/proc/meminfo 의 MemTotal 및 SwapTotal)
[used]사용중인 메모리 크기 또는 사용중인 스왑 메모리 크기 (total - free - buffers - cache 으로 계산)
[free]사용하지 않은 메모리 크기 또는 사용되지 않은 스왑 메모리 크기 (/proc/meminfo 의 MemFree 및 SwapFree)total - used - buff/cache
[shared]주로 tmpfs(메모리 파일시스템) 에서 사용하는 메모리. 여러 프로세스에서 사용할 수 있는 공유 메모리
[buffers]커널 buffer 로 사용중인 메모리
[cache]page cache 와 slab 으로 사용중인 메모리
[buff/cache]버퍼와 캐시 메모리의 합
[available]Swapping 없이 새 응용 프로그램을 사용하는 데 사용할 수 있는 메모리의 크기.기존에 존재하던 -/+buffer/cache 부분이 사라지고 생겼다.
free 와 available 차이
# Pagecache 비우기
$ echo 1 > /proc/sys/vm/drop_caches
or
$ echo sysctl -w vm/drop_caches=1
# Dentries, Inodes 비우기
$ echo 2 > /proc/sys/vm/drop_caches
or
$ echo sysctl -w vm/drop_caches=2
Dentries, Inodes : 파일의 자료구조를 의미한다. 보다 빠른 데이터 접근을 위해 Slab의 자료구조에 추가되어 사용, dentry는 경로명 탐색을 위한 cache 역할도 수행
# Pagecache, Dentries, Inodes 모두 비우기
$ echo 3 > /proc/sys/vm/drop_caches
or
$ echo sysctl -w vm/drop_caches=3
# /etc/crontab
0 0 * * 0 sync && echo 3 > /proc/sys/vm/drop_caches # 매일 오전 0시에 캐시 비우기
위와 같이 cron 으로 자동화를 할 수 있지만 파일 I/O 가 빈번하게 일어나는 시스템이라면 CPU 사용량이 높아질 수 있다.
참고