2013年2月27日 星期三

[Linux]記憶體消失?

參考資料:
http://www.linuxatemyram.com/

free指令可以了解目前記憶體使用的狀況。
突然有一天你發現自己可用(顯示為free)的記憶體突然變得很少,
但是又沒有真的在跑很多程式,你懷疑是不是linux吃掉你的記憶體?

並不是,簡單來講,linux覺得與其讓RAM放著沒事幹,
不如讓它做點其他工作,像是檔案的buff和cache,提升系統效能。
你在其他欄位(buffers和cached)就可以發現它們跑到那邊去了。
當你真的要用更多記憶體的時候,它們會馬上回來,不需要擔心。

利用 echo 1 > /proc/sys/vm/drop_caches
就可以看到free的記憶體又變很多了。

參考資料下面也有驗證:
http://www.linuxatemyram.com/play.html

簡單來講,自己寫一個瘋狂malloc的程式,
就可以看出其實可用的記憶體仍然超過free顯示的量,
證明你還是有很多可用的記憶體,雖然它們不在free那區。

[Linux]記憶體管理(/proc/sys/vm/)

參考資料
http://www.kernel.org/doc/Documentation/sysctl/vm.txt

(註:用free指令可以看目前的記憶體使用狀況)

幾個比較有用的:
(用cat查值;用echo > 寫值,例:echo 2 > /proc/sys/vm/overcommit_memory)


drop_caches:
利用echo寫入,就可以讓linux放掉cache,讓free記憶體變多。
這操作是無害的,不會放掉髒資料(暫存卻還未寫入)。
可以在操作前先做sync寫入髒資料,這樣釋放的記憶體就會比較多。

min_free_kbytes:
設定最少必須保留多少kb的free記憶體。
不要設低於1024,不然很可能會有問題。
但設太高的話,系統就容易OOM(記憶體用光)。

overcommit_memory:
可能的值有0,1,2,預設為0。
0的話系統即使在程式要求梢多於可用記憶體時也會接受,想辦法從其他地方擠出來給你用。
(這就是overcommit)
1的話程式的記憶體要求永遠不會被拒絕。
2的話相對就是保守,超過的要求就會被拒絕。(和overcommit_ratio搭配使用)

overcommit_ratio:
當overcommit_memory被設成2,就會參考這邊的值。
這時使用者程式可用的記憶體就是swap+(實體記憶體*overcommit_ratio%)

vfs_cache_pressure:
系統取回cache的傾向,預設為100。
越低的話系統越不會放掉cache,最小為0,就永遠不放,一下就會OOM了。
反之高則沒有極限的樣子,
http://www.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.7/2.6.7-mm1/broken-out/vfs-shrinkage-tuning.patch
甚至可以設到10萬。



一般使用者沒什麼必要去調這些就是了...
除非是在資源很少的機器上,或是高負載會碰到OOM的情況再來看這邊調整就好。

真的要詳細了解記憶體的話
Understanding the Linux Virtual Memory Manager
http://kernel.org/doc/gorman/
可以直接下載,深度了解linux的記憶體機制。(很硬...)