这里写图片描述

近日,部署应用程序的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
2
3
4
5
6
7
8
9
10
/proc/sys/net/core/wmem_max        最大的socket写socket缓存大小(Byte)
/proc/sys/net/core/wmem_default 默认的socket写socket缓存大小(Byte)
/proc/sys/net/core/rmem_max 最大的socket读socket缓存大小(Byte)
/proc/sys/net/core/rmem_default 默认的socket读socket缓存大小(Byte)
/proc/sys/net/ipv4/tcp_wmem TCP socket写socket缓存大小(Byte)
/proc/sys/net/ipv4/tcp_rmem TCP socket读socket缓存大小(Byte)
/proc/sys/net/ipv4/tcp_mem TCP socket缓存大小(单位:页,每页4k大小)
/proc/sys/net/ipv4/udp_mem UDP socket缓存大小(单位:页,每页4k大小)
/proc/sys/net/ipv4/udp_rmem_min UDP socket接收缓冲去最小值
/proc/sys/net/ipv4/udp_wmem_min UDP socket发送缓冲区最小值

特别注意:tcp_mem及udp_mem两者单位均为页内存。

最后通过调整上述参数,使得系统得到优化,同时不影响用户面性能。

其他解决方案:

1,升级系统至64位,64位系统基本都是LowMem,不存在LowMem不足问题。

2,其他方案均没有成功得到验证。

附:

1.查看socket占用内存情况:

cat /proc/net/socket

2.查看socket buff情况

slabtop:

skbuff_head_cache