1. 程式人生 > >Linux內存高,觸發oom-killer問題解決

Linux內存高,觸發oom-killer問題解決

滿足 linux 更多 sshd buffers 優先 blog arp use

最近遇到兩起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,用來確定系統開始回收內存的閥值,控制系統的空閑內存。值越高,內核越早開始回收內存,空閑內存越高。

?
[[email protected] 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

Linux內存高,觸發oom-killer問題解決