解决Out of socket memory问题

简介: 两种情况会出发 "Out of socket memory" 的信息: 1.有很多的孤儿套接字(orphan sockets) 2.tcp socket 用尽了给他分配的内存 首先看看情况 2。

两种情况会出发 "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

目录
相关文章
|
网络协议 关系型数据库 Linux
The "Out of socket memory" error
The "Out of socket memory" error I recently did some work on some of our frontend machines (on which we run Varnish) at StumbleUpon and decided ...
1132 0
|
网络协议
out of socket memory相关tcp参数
out of socket memory调整 主要是调整TCP缓冲区 Increasing the TCP send and receive buffers will increase the performance a lot if (and only if) you have a lot of large files to send.
882 0
|
4月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
93 0
|
18天前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
17 0
|
3月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
41 4
|
3月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
58 2
|
3月前
|
网络协议 程序员 视频直播
|
3月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
28 3
|
3月前
|
消息中间件 网络协议 网络安全
Python Socket编程:打造你的专属网络通道,基础篇与进阶篇一网打尽!
【7月更文挑战第26天】在网络编程领域,Python以简洁语法和强大库支持成为构建应用的首选。Socket编程为核心,实现计算机间的数据交换。
61 1
|
3月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解