问题:tcp_mem

在服务端,连接达到一定数量,诸如50W时,有些隐藏很深的问题,就不断的抛出来。 通过查看dmesg命令查看,发现大量TCP: too many of orphaned sockets错误,也很正常,下面到了需要调整tcp socket参数的时候了。

第一个需要调整的是tcp_rmem,即TCP读取缓冲区,单位为字节,查看默认值

  1. cat /proc/sys/net/ipv4/tcp_rmem

  2. 4096 87380 4161536

默认值为87380bit ≈ 86K,最小为4096bit=4K,最大值为4064K。

第二个需要调整的是tcp_wmem,发送缓冲区,单位是字节,默认值

  1. cat /proc/sys/net/ipv4/tcp_wmem

  2. 4096 16384 4161536

解释同上

第三个需要调整的tcp_mem,调整TCP的内存大小,其单位是页,1页等于4096字节。系统默认值:

  1. cat /proc/sys/net/ipv4/tcp_mem

  2. 932448 1243264 1864896

tcp_mem(3个INTEGER变量):low, pressure, high

  • low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
  • pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
  • high:允许所有tcp sockets用于排队缓冲数据报的页面量,当内存占用超过此值,系统拒绝分配socket,后台日志输出“TCP: too many of orphaned sockets”。

一般情况下这些值是在系统启动时根据系统内存数量计算得到的。 根据当前tcp_mem最大内存页面数是1864896,当内存为(1864896*4)/1024K=7284.75M时,系统将无法为新的socket连接分配内存,即TCP连接将被拒绝。

实际测试环境中,据观察大概在99万个连接左右的时候(零头不算),进程被杀死,触发out of socket memory错误(dmesg命令查看获得)。每一个连接大致占用7.5K内存(下面给出计算方式),大致可算的此时内存占用情况(990000 * 7.5 / 1024K = 7251M)。

这样和tcp_mem最大页面值数量比较吻合,因此此值也需要修改。

三个TCP调整语句为:

  1. echo "net.ipv4.tcp_mem = 786432 2097152 3145728">> /etc/sysctl.conf

  2. echo "net.ipv4.tcp_rmem = 4096 4096 16777216">> /etc/sysctl.conf

  3. echo "net.ipv4.tcp_wmem = 4096 4096 16777216">> /etc/sysctl.conf

备注: 为了节省内存,设置tcp读、写缓冲区都为4K大小,tcp_mem三个值分别为3G 8G 16G,tcp_rmemtcp_wmem最大值也是16G。

目标达成

经过若干次的尝试,最终达到目标,1024000个持久连接。1024000数字是怎么得来的呢,两台物理机器各自发出64000个请求,两个配置为6G左右的centos测试端机器(绑定7个桥接或NAT连接)各自发出640007 = 448000。也就是 1024000 = (64000) + (64000) + (640007) + (64000*7), 共使用了16个网卡(物理网卡+虚拟网卡)。 
终端输出

  1. ......

  2. online user 1023990

  3. online user 1023991

  4. online user 1023992

  5. online user 1023993

  6. online user 1023994

  7. online user 1023995

  8. online user 1023996

  9. online user 1023997

  10. online user 1023998

  11. online user 1023999

  12. online user 1024000

在线用户目标达到1024000个!

服务器状态信息

服务启动时内存占用:

total       used       free     shared    buffers     cached     Mem:         10442        271      10171          0         22         78     -/+ buffers/cache:        171      10271     Swap:         8127          0       8127

系统达到1024000个连接后的内存情况(执行三次 free -m 命令,获取三次结果):

total       used       free     shared    buffers     cached     Mem:         10442       7781       2661          0         22         78     -/+ buffers/cache:       7680       2762     Swap:         8127          0       8127                  total       used       free     shared    buffers     cached     Mem:         10442       7793       2649          0         22         78     -/+ buffers/cache:       7692       2750     Swap:         8127          0       8127                  total       used       free     shared    buffers     cached     Mem:         10442       7804       2638          0         22         79     -/+ buffers/cache:       7702       2740     Swap:         8127          0       8127

这三次内存使用分别是7680,7692,7702,这次不取平均值,取一个中等偏上的值,定为7701M。那么程序接收1024000个连接,共消耗了 7701M-171M = 7530M内存, 7530M*1024K / 1024000 = 7.53K, 每一个连接消耗内存在为7.5K左右,这和在连接达到512000时所计算较为吻合。 
虚拟机运行Centos内存占用,不太稳定,但一般相差不大,以上数值,仅供参考。

执行top -p 某刻输出信息:

    top - 17:23:17 up 18 min,  4 users,  load average: 0.33, 0.12, 0.11

Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie     Cpu(s):  0.2%us,  6.3%sy,  0.0%ni, 80.2%id,  0.0%wa,  4.5%hi,  8.8%si,  0.0%st     Mem:  10693580k total,  6479980k used,  4213600k free,    22916k buffers     Swap:  8323056k total,        0k used,  8323056k free,    80360k cached       PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                            2924 yongboy   20   0 82776  74m  508 R 51.3  0.7   3:53.95 server

执行vmstate:

  1. vmstat

  2. procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

  3. r b swpd free buff cache si so bi bo in cs us sy id wa st

  4. 0 0 0 2725572 23008 80360 0 0 21 2 1012 894 0 9 89 2 0

获取当前socket连接状态统计信息:

  1. cat /proc/net/sockstat

  2. sockets: used 1024380

  3. TCP: inuse 1024009 orphan 0 tw 0 alloc 1024014 mem 2

  4. UDP: inuse 11 mem 1

  5. UDPLITE: inuse 0

  6. RAW: inuse 0

  7. FRAG: inuse 0 memory 0

获取当前系统打开的文件句柄:

  1. sysctl -a | grep file

  2. fs.file-nr = 1025216 0 1048576

  3. fs.file-max = 1048576

此时任何类似于下面查询操作都是一个慢,等待若干时间还不见得执行完毕。

  1. netstat -nat|grep -i "8000"|grep ESTABLISHED|wc -l

  2. netstat -n | grep -i "8000" | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

以上两个命令在二三十分钟过去了,还未执行完毕,只好停止。

小结

本次从头到尾的测试,所需要有的linux系统需要调整的参数也就是那么几个,汇总一下:

echo "yongboy soft nofile 1048576" >> /etc/security/limits.conf     echo "yongboy hard nofile 1048576" >>  /etc/security/limits.conf     echo "fs.file-max = 1048576" >> /etc/sysctl.conf     echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf     echo "net.ipv4.tcp_mem = 786432 2097152 3145728" >> /etc/sysctl.conf     echo "net.ipv4.tcp_rmem = 4096 4096 16777216" >> /etc/sysctl.conf     echo "net.ipv4.tcp_wmem = 4096 4096 16777216" >> /etc/sysctl.conf

其它没有调整的参数,仅仅因为它们暂时对本次测试没有带来什么影响,实际环境中需要结合需要调整类似于SO_KEEPALIVE、tcpmax_orphans等大量参数。

TCP: too many of orphaned sockets错误相关推荐

  1. TCP: too many of orphaned sockets报错解决

    tcp_mem 在服务端,连接达到一定数量,诸如50W时,有些隐藏很深的问题,就不断的抛出来. 通过查看dmesg命令查看,发现大量TCP: too many of orphaned sockets错 ...

  2. 客户端dmesg_查看dmesg,会打出很多的日志“TCP: too many of orphaned sockets”

    (转)http长连接200万尝试及调优 原创 2013年07月01日 17:39:34 3444 原文在:http://rdc.taobao.com/blog/cs/?p=1062 其中讲到了很多TC ...

  3. linux 网络错误 TCP: too many orphaned sockets 解决方法

    目录 1.端口与socket 2.端口耗尽 3.socket资源耗尽 4.回到正题来 解决方案: echo "net.ipv4.ip_local_port_range = 1024 6553 ...

  4. tcp too many orphaned sockets 问题引发的思考

    起因:同事在服务器上部署了单个golang编写的HTTPDNS实例,一个固定的端口9981对外提供服务.当QPS达到几十万以上时,该实例崩溃,且无法再次启动 dmesg 查看系统日志,发现大量日志,如 ...

  5. TCP/IP 某些最常见的错误原因码 (errno)列表

    TCP/IP 某些最常见的错误原因码 (errno)列表 对于在基于 UNIX 的环境中的 TCP/IP 用户,下表列出了某些最常见的错误原因码 (errno).它不是完整的错误列表.可以在文件 /u ...

  6. tcp连接时,BROKEN PIPE错误的原因以及解决方法

    tcp连接时,BROKEN PIPE错误的原因以及解决方法 参考文章: (1)tcp连接时,BROKEN PIPE错误的原因以及解决方法 (2)https://www.cnblogs.com/ctho ...

  7. Windows Sockets错误标识及对应解释

    WSAETIMEDOUT 对应 linux 的 ETIMEDOUT WSAETIMEDOUT 对应 linux 的 ETIMEDOUT IdWinsock2.pas 文件中也有说明. Windows ...

  8. tcp连接时,BROKEN PIPE错误

    TCP协议是端到端的传输控制协议,之所以是"端到端"的协议,是因为"路由"是由IP协议负责的,TCP协议负责为两个通信端点提供可靠性保证,这个可靠性不是指一个端 ...

  9. TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行

    对于网络调试助手如NetAssist等连接不上服务器且左下角显示"1035 未知错误"的问题,本人困惑许久,参考了网上的多种解决方法,有的说法是网络调试助手的版本太低,在Win10 ...

最新文章

  1. 【问题解决】移动端rem适配的时候会出现打开页面时先缩小(放大)后恢复到正常页面的问题
  2. 几种USB控制器类型:OHCI,UHCI,EHCI,XHCI
  3. 浅谈ORACLE AWR single instance 一
  4. struts bean static 静态方法注入
  5. C# / VB.NET合并PDF指定页
  6. SQLite、MySQL和PostgreSQL 三种关系数据库比较
  7. mysql pt archiver_mysql 案例 ~ pt-archiver 归档工具的使用
  8. maxwell监控mysql_利用Maxwell组件实时监听Mysql的binlog日志
  9. 基于JAVA+SpringMVC+MYSQL的火车票订票系统
  10. Spring后处理Bean(BeanPostProcessor 接口)Bean增强
  11. echarts 按需引入模_【React】react项目引入echarts插件
  12. 自然语言处理(NLP)资源
  13. 修改select下拉框样式兼容IE和Chrome浏览器
  14. 使用UltraISO刻录自己的音乐CD步骤
  15. 组装一台电脑需要选购哪些基本部件
  16. 神经网络在通信中的应用,神经网络技术及其应用
  17. [记录学习]自学动力节点荣姐SpringMVC5笔记
  18. 哔咔服务器维护时间,哔咔
  19. RBAC权限模型学习总结
  20. 极简linux版本,4MLinux 26.0发布,这是一个极简版本

热门文章

  1. 大一期末C语言大作业—结构体和链表框架
  2. 游戏安全--手游安全技术入门笔记
  3. 和我一起学Python
  4. OpenFOAM常用类
  5. 做项目和做产品有什么区别
  6. 香港美国CERA机房你怎么选择?
  7. maximo跟java_maximo中直接应用得到数据库联接
  8. 虚幻四Gameplay Ability System入门学习合集
  9. 食肉动物和食草动物的双眼分布不同的原因
  10. 豆瓣最新API-python