解决Out of socket memory问题

两种情况会出发 "Out of socket memory" 的信息:

1.有很多的孤儿套接字(orphan sockets)

2.tcp socket 用尽了给他分配的内存

首先看看情况 2。对于 TCP socket 来说,使用 pages 来计数的,而非 bytes,一般情况下 1 page = 4096 bytespage 大小可以通过下面命令获得:

$ getconf PAGESIZE

4096

查看内核分配了多少的内存给 TCP

$ cat /proc/sys/net/ipv4/tcp_mem

69618   92825   139236

第一个数字表示,当 tcp 使用的 page 少于 69618 时,kernel 不对其进行任何的干预

第二个数字表示,当 tcp 使用了超过 92825 pages 时,kernel 会进入 “memory pressure

第三个数字表示,当 tcp 使用的 pages 超过 139236 时,我们就会看到题目中显示的信息

查看 tcp 实际用的内存:

$ cat /proc/net/sockstat

sockets: used 116

TCP: inuse 3 orphan 0 tw 4 alloc 4 mem 110

UDP: inuse 1 mem 1

UDPLITE: inuse 0

RAW: inuse 0

FRAG: inuse 0 memory 0

可以看到,实际使用的 mem(110) 远远小于 69618,所以,“Out of socket memory”的错误是由于第一种情况引起的。

orphan socket 对于应用程序来说,意义不大,这也是内核要限制被 orphan socket 消耗内存的原因。而对于 web server 来说,有大量的 orphan socket 也属正常,那么多的连接放在那儿了。

查看 orphan socket 限制:

$ cat /proc/sys/net/ipv4/tcp_max_orphans

对比当前系统中的:

$ cat /proc/net/sockstat

sockets: used 14565

TCP: inuse 35938 orphan 21564 tw 70529 alloc 35942 mem 1894

由于内核代码中有个位运算,所以实际的跟最大的是 2x 或者是 4x 的关系。现在根据实际情况,将 tcp_max_orphans 调到一个合理的值就可以了。原则上该值建议只增大,另外,每个 orphan 会消耗大概 64KB 的内存。

还有个叫 tcp_orphan_retries 参数,对于 web server,可以减小。

修改了上面的一些配置参数,报错日志还是在一直往外报。

####################################################################################################

net.ipv4.tcp_max_orphans = 18000

最后修改值到18000Out of socket memory报错解决。

net.ipv4.tcp_max_tw_buckets = 10000

最后修改值到net.ipv4.tcp_max_tw_buckets = 10000kernel: printk: xxx messages suppressed.报错解决。

记得参数修改完成执行 sysctl -p

#######################################################################################################

原文

http://www.360doc.com/content/13/0514/01/5407405_285259602.shtml

posted @ 2013-05-14 01:38  浪里飞  阅读(1365)  评论(0编辑  收藏  举报