2011년 2월 22일

리눅스와 캐쉬 메모리

최근 OS들의 캐쉬 관련 메모리 관리 정책

최근 OS의 캐시메모리 할당 정책은 캐시가 free 메모리의 대부분을 사용하는 것이다.

[root@inkium vm]# free
total used free shared buffers cached
Mem: 4147776 4067816 79960 0 91888 2794568
-/+ buffers/cache: 1181360 2966416
Swap: 8385920 234356 8151564


[root@inkium vm]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
 0  0 234356  73944  91888 2794828   26    7    29    29    0     1  1  0 97  2



윈95 같은 경우는 캐시메모리를 특정 사이즈를 제한이 되어 있어서 내 컴이 1기가던 2기가던 아무리 많은 free 메모리가 남아 있어도 일정 캐시 메모리만을 사용하므로서 메모리를 비효율적으로 사용 했지만, 리눅스나 윈도우즈 2000 등의 OS 들은 free 메모리가 있으면 계속해서 캐시를 늘려가게 된다.

최소한의 free 메모리만을 남기고 캐시를 계속 증가시켜 처리를 하다가 다른 프로그램이 메모리를 요청했을때 free 메모리가 부족하면 그 때 캐시에서 가장 사용률이 낮은 데이터를 제거 하고 free 메모리를 할당하게 된다.

최소한의 free 메모리를 남겨두는 것은 프로그램이 메모리를 요구 했을 때, 캐시를 비우고 메모리를 할당하게 되면 성능의 저하가 발생하기 때문에 약간의 free 메모리를 남겨두어 그 메모리에서 즉시 요구하는 메모리를 반환해주고, 그 후에 캐시에서 다시 부족한 부분만큼 free 메모리를 할당하게 된다.

리눅스에서 캐쉬 관련 메모리 관리
Linux 의 경우, 캐시를 모두 free 메모리로 돌려도 메모리가 모자라는 경우 아니라면 swapout 하지 않는다. 이유는 swapout 의 비용이 너무 크기 때문이다. 또한, cache 는 실제로 큰 가치가 없다. 앞으로 더이상 사용되지 않을 데이터라도 cache 영역에 자리잡고 있게 되기 때문이다. 단지, 남아도는 메모리를 그냥 남겨놓는거 보다는 cache 로 만들어서 혹시나 해당 데이터를 다시 사용할 일이 생길때 조금 더 빠르게 반응하는것이 낫기 때문에 사용되는 방식이다.

리눅스가 메모리상에 cache 영역을 남기는 것을 구분하자면 page cachedisk cache 로 나눌 수가 있다. page cache 는 빈번히 일어나는 메모리 할당/해제의 오버헤드를 줄이기 위해서 고안된 cache 이고, disk cache 는 디스크를 읽는 횟수를 줄이기 위한 cache 이다.

disk cache 는 VFS 레이어와 많은 상관관계를 가지고 있다. 마운트한 파일시스템의 superblock 같은 메타데이터를 캐싱하는 것도 disk cache 에 포함되는 것이기 때문이다. disk 상에서 특정 파일을 액세스 하는 경우, 해당 파일의 inode 에 붙는 디엔트리 객체에 disk cache 가 연결된다. 해당 파일을 더이상 사용하지 않더라도 읽어들인 내용을 그대로 메모리상에 유지하게된다. 그 이후에 다시 해당 파일을 액세스 하는 경우에는 디스크 액세스를 하지 않고 메모리상에 남아있는 내용을 그대로 사용하는 것이다. 이 경우의 성능향상은 압도적이라 할 수 있을 것이다.

댓글 2개:

  1. 안녕하세요...제가 알고 있는 안당님이 맞군요...잘 지내시죠?

    답글삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제