CentOS OOM问题分析
近日,部署应用程序的CentOS操作系统频繁kill应用进程,感到非常意外。通过对系统日志进行分析,发现syslog中输出out of memery,LowMem不足。
经过查阅大量的资料,分析发现是由于32位系统寻址空间的限制。32位linux将内存空间分为三部分:DMA、Normal(LowMem)、HighMem。其范围如下:
Zone PFN ranges:
DMA 0x00000000 -> 0x00FFFFFF 16M
Normal 0x01000000 -> 0x37FFFFFF 880M
HighMem 0x38000000 ->
其中,DMA为系统直接存储器空间,LowMem为系统低端内存,主要为Linux内核使用,HighMem为通用内存。(注:64位系统基本都是LowMem)
一般情况下,16G内存的IBM服务器LowMem约700M,系统启动后剩余约600M。
经过对各个进程进行分析后发现,有一个进程会对内核协议栈参数进行优化,使得socket缓冲过大,从而导致LowMem耗尽,从而触发了OOM问题。
OOM(Out Of Memery)是Linux下一种保护机制,保证机器能够正常运转的机制。该机制在内存耗尽时会通过kill一些进程来释放LowMem。同时会在系统日志中输出相应的Log。
Linux下内核各参数意义
1 | /proc/sys/net/core/wmem_max 最大的socket写socket缓存大小(Byte) |
特别注意:tcp_mem及udp_mem两者单位均为页内存。
最后通过调整上述参数,使得系统得到优化,同时不影响用户面性能。
其他解决方案:
1,升级系统至64位,64位系统基本都是LowMem,不存在LowMem不足问题。
2,其他方案均没有成功得到验证。
附:
1.查看socket占用内存情况:
cat /proc/net/socket
2.查看socket buff情况
slabtop:
skbuff_head_cache