2010년 11월 25일 목요일

리눅스에서 실제 사용가능한 메모리가 적게 보이는 경우는...메모리 확보하기

리눅스 시스템을 사용하다 보면, 분명 물리적 메모리는 많은데 실제 사용 가능한 메모리가 적게 나와
보이는 경우가 있다. 아래의 경우를 보자:

# free
             total       used       free     shared    buffers     cached
Mem:       8301476    7941864     359612          0     112468    7295056
-/+ buffers/cache:     534340    7767136
Swap:      2650684        676    2650008

전체 메모리는 8,301,476 에서 7,941,864 가 사용되고 있다. 그런데 실제 동작하고 있는 프로세스는
이 정도 만큼을 사용하지 않고 있다. free 에서 보이는 필드 중 cached 가 있다. 캐쉬가 되어 있는 것이
7,295,056 이다. 리눅스 커널은 성능향상을 위해 캐쉬를 하게되는데, 바로 이 수치이다. 이것은 일반적인
상황이며, 많이 사용되고 있다고 걱정할 부분은 아니다. 캐쉬는 실제 프로그램이 동작하기 위해서 사용되는
엑티브된 메모리 페이지 보다 우선순위가 낮게 주어진다.

예를 들어, 1기가의 메모리를 가지고 있는데, 프로그램에 의해 700 메가가 사용되고 있다고 하자. 200메가
정도도 캐쉬되어 있고 50메가 정도가 프리로 남아있는 상태에서 프로그램 동작하는데 150 메가 필요하다면,
캐쉬가 사용되는 부분을 실제 엑티브 되어 돌아가야 하는 프로세스에 할당이 되게 된다.

즉, 캐쉬는 시스템상에서 프로그램이 좀더 빠르게 응답/동작할 수 있도록 하는 것이다.

이런 캐쉬를 사용자에 의해 초기화 시킬 수도 잇는데, /proc/sys/vm/drop_caches 이용하면 된다.

# cat /proc/sys/vm/drop_caches
0
# echo 3 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
3

위와 같이 값이 3으로 변경된걸 볼 수 있고, 다시 free 를 해 보면 사용가능한 메모리가 크게 늘어나 있는 것을
확인할 수 있다. 대신 캐쉬되어 있는것은 크게 줄어 있다.

# free
             total       used       free     shared    buffers     cached
Mem:       8301476     436616    7864860          0        464      10568
-/+ buffers/cache:     425584    7875892
Swap:      2650684        676    2650008
# cat /proc/meminfo
MemTotal:      8301476 kB
MemFree:       7863868 kB
Buffers:          1492 kB
Cached:          13448 kB
SwapCached:          0 kB
Active:         394288 kB
Inactive:         3456 kB
HighTotal:     7461476 kB
HighFree:      7062172 kB
LowTotal:       840000 kB
LowFree:        801696 kB
SwapTotal:     2650684 kB
SwapFree:      2650008 kB
Dirty:             100 kB
Writeback:           0 kB
AnonPages:      382952 kB
Mapped:          10456 kB
Slab:            13140 kB
SReclaimable:     2968 kB
SUnreclaim:      10172 kB
PageTables:       1300 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
WritebackTmp:        0 kB
CommitLimit:   6801420 kB
Committed_AS:  1179472 kB
VmallocTotal:   116728 kB
VmallocUsed:      4236 kB
VmallocChunk:   111888 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
HugePages_Surp:      0
Hugepagesize:     2048 kB

이 작업은 커널상에서 캐쉬를 클리어하게 만드는 것으로, 값은 1,2,3 중에 하나를 가질 수 있다. 1은 PageCache 를 2는 트리와 아이노드를 클리어하며 3은 1과2를 두개다 하는 것과 같다. 캐쉬를 클리어하기 전에는 sync 를 수행하고 하는 것이 좋으며, 이 drop_caches 기능은 커널 2.6.16 에 추가되었다.

일부 사용자는 캐쉬 클리어를 한 후 시스템이 Hang 이 되었다는 얘기도 있으므로 참고하길 바란다.

[참고]
1. http://encyclopedia.thefreedictionary.com/cache+memory
2. http://www.faqs.org/docs/linux_admin/buffer-cache.html

댓글 없음:

댓글 쓰기