Linux記憶體高,觸發oom-killer問題解決 1. 首先確認該系統的版本是32位 #uname -a Linux alarm 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i3862. 我們瞭解一下32位Linux的記憶體管理結構 # DMA: 0x00000000 - 0x00999999 (0 - 16 MB) # LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB # HighMem: 0x038000000 - <硬體特定> 核心使用low memory來跟蹤所有的記憶體配置,這樣的話一個16GB記憶體的系統比一個4GB記憶體的系統,需要消耗更多的low memory,當low memory耗盡,即便系統仍然有剩餘記憶體,仍然會觸發oom-killer。在2.6核心的表現是,殺掉佔用記憶體最高的進程,所以會導致sshd等進程被殺掉,造成系統無法登入。3. 如何查看lowMem -bash-3.00# free -lm total used free shared buffers cachedMem: 2026 1973 52 0 36 1303Low: 874 823 51High: 1151 1150 1-/+ buffers/cache: 633 1392Swap: 3067 142 2924 4. 所以我們需要保護LowMem,在2.6核心引入了lower_zone_protection,這將讓核心願意保護low memory,從而在分配記憶體時優先考慮從high memory分配。 -bash-3.00# cat /proc/sys/vm/lower_zone_protection 0 -bash-3.00#echo 400 > /proc/sys/vm/lower_zone_protection 另一起問題是24G記憶體的系統,空閑記憶體已經不到50M1. 確認該系統的版本是64位 # uname -a Linux gxgd-nms-app 2.6.18-194.el5xen #1 SMP Tue Mar 16 22:01:26 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux2. 用ps查看各進程的記憶體,大約就佔用了4G, 絕大部分記憶體都是被Page Cache所佔用。Linux核心的策略是最大程度的利用記憶體cache 檔案系統的資料,提高IO速度,雖然在機制上是有進程需要更大的記憶體時,會自動釋放Page Cache,但不排除釋放不及時或者釋放的記憶體由於存在片段不滿足進程的記憶體需求。 所以我們需要一個方法,能夠限定PageCache的上限。Linux 提供了這樣一個參數min_free_kbytes,用來確定系統開始回收記憶體的閥值,控制系統的空閑記憶體。值越高,核心越早開始回收記憶體,空閑記憶體越高。 [root@zyite-app01 root]# cat /proc/sys/vm/min_free_kbytes 163840 echo 963840 > /proc/sys/vm/min_free_kbytes其他可選的臨時解決方案:關閉oom-killercat /proc/sys/vm/oom-killecho "0" > /proc/sys/vm/oom-killvi /etc/sysctl.confvm.oom-kill = 02. 清空cache (可選)echo 1 > /proc/sys/vm/drop_caches