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 i386
2. 我們了解一下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 cached
Mem: 2026 1973 52 0 36 1303
Low: 874 823 51
High: 1151 1150 1
-/+ buffers/cache: 633 1392
Swap: 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內存的系統,空閒內存已經不到50M
1. 確認該系統的版本是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/Linux
2. 用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-killer
cat /proc/sys/vm/oom-kill
echo "0" > /proc/sys/vm/oom-kill
vi /etc/sysctl.conf
vm.oom-kill = 0
2. 清空cache (可選)
echo 1 > /proc/sys/vm/drop_caches