关于32位Linux系统内存溢出问题的情况及
几种常见解决方法
由于近期Xenserver系统的OOMkill引起的批量虚拟机hang死以及刀片宕机重启问题,所以针对Out of memory 问题进行了了解和熟悉。
根据查阅网上一些文档LINUX系统具有OOM Killer的保护机制,用于避免Linux 在内存不足的时候不至于出太严重的问题,把一些无关紧要的进程杀掉,以保证系统的正常运行。
内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被称为虚拟地址空间,因此32位CPU的虚拟地址空间大小是2的32次方=4 294 967 296为4G,这和实际的物理内存数量无关。
Linux内核将虚拟地址空间分成了两部分:
一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用户空间;
一部分是由内核保留使用的,这部分地址是地址空间的高地址部分,从KERNELBASE到结束,称为内核空间;
所以在32位系统,一个进程的可寻址范围是有限的
Linux内核定义了下面三个区域:
# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 -
其中LowMem 区(也叫NORMAL ZONE ) 一共880 MB,而且不能改变(除非用hugemem 内核)。对于高负载的系统,就可能因为LowMem 利用不好而引发OOM Killer 。一个可能原因是LowFree 太少了,另外一个原因是LowMem 里都是碎片,请求不到连续的内存区域
检查当前LowFree 的值:
# cat /proc/meminfo |grep LowFree
检查LowMem内存碎片:
# cat /proc/buddyinfo
上面这条命令要在2.6 Kernel 环境下有效。
有如下方法可以解决该问题:
1.升级到64位系统,这是最好的方法,因为此时内核的寻址范围为2的64次方,所有内存都属low memory,如此时提示out of memory,则真的是low memory耗尽了。(目前云桌面xenserver位linux32位SMP内核
2.6.32.12-0.7.1版本)
2. 如必须使用32位系统,那么可以使用hugemem内核,此时内核会以不同的方式分割low/high memory,而大多数情况下会提供足够多的low memory至high memory的映射,此时很简单的一个修复方法是可以安装hugemem内核包,然后重启。