Linux 메모리 관리 - Buffer / Cache

Dev/Linux 2013. 1. 4. 16:35

Linux에서 HDD같은 Storage Device에서 파일들을 읽어오고 그것을 free했을 시에 [cat /proc/meminfo]등으로 메모리 사용량을 보면 free메모리가 증가하지 않고 Cached의 양이 늘어나는 경우를 볼 수 있다.


리눅스의 메모리 관리 시나리오를 살펴봐야 왜 이렇게 되는지 이해를 할수가 있다. 아래 링크의 글을 살펴보자.

[KLDP - Linux Kernel - 메모리 관리]


링크글의 [3.2 캐시]를 보면 시스템의 성능을 극대화 하기 위해서 디스크에서 불러온 데이터들을 캐시로 관리 한다는 내용을 볼 수 있다. 이처럼 디스크에서 불러온 데이터를 또 불러올 수도 있기 때문에 메모리를 free하지 않고 캐시로 관리하게 되는 것이다.


문제는 임베디드 프로그래밍을 하다 보면 또는 네트워크서버를 운영하면, 계속 메모리를 할당해야 되는 경우가 발생하는데, 메모리가 계속 Cached되어서 할당할 메모리가 없는 상황이 발생할 수 있다. (보통 10MB할당하려고 하는데 Free Memory가 계속 4MB이거나, 숫자는 다르나 이와 비슷한 경우일 것이다.)


이러한 경우가 발생하지 않도록 하는 방법/혹은 이런 경우 해결할 수 있는 방법은 아래와 같다.



1. 최소 Free 메모리 사이즈를 정해서, 필요한 메모리들을 커널이 미리 확보해 놓도록 하는 방법이다. 이렇게 최소 Free 메모리를 정해놓음으로서 커널은 Free 메모리가 정해놓은 기준 이하가 되면 Cached된 메모리를 알아서 Free시킨다.

최소 Free 메모리 사이즈를 설정하는 방법은 sysctl을 사용하는 것이다. 프로그램 상에서 호출하는 방법는 sysctl.h를 참고하도록 하자. 쉘상에서 설정하는 명령어는 아래와 같다. 아래 숫자를 더 크게 잡으면 된다. 단위는 KB.


sysctl -w vm.min_free_kbytes=16384



2. Cached된 메모리를 직접 free시켜버리는 방법이다. 쉘 상에서 아래 명령어를 실행시키면 된다.


sudo sync

sudo sysctl -w vm.drop_caches=3

sudo sysctl -w vm.drop_caches=0






: