首页 > 运维 > TCP全链接队列满的问题分析之net.core.somaxconn详解
2021
11-13

TCP全链接队列满的问题分析之net.core.somaxconn详解

背景

最近控制台查看腾讯云服务器状态时,发现一个异常情况提示如下:

该实例最近12小时内在2021-11-13 14:48出现过TCP全链接队列满的情况,为避免成为业务瓶颈,建议您检查业务健康情况。可参考文档:点击查看


TCP 全连接队列满

TCP 全连接队列的长度取 net.core.somaxconn 及业务进程调用 listen 时传入的 backlog 参数,两者中的较小值。TCP 全连接队列足最大值取决于 somaxconn 和 backlog 之间的最小值,也就是 min(somaxconn, backlog)


somaxconn 是 Linux 内核的参数,默认值是 128,可以通过 /proc/sys/net/core/somaxconn 来设置其值;

backloglisten(int sockfd, int backlog) 函数中的 backlog 大小,Nginx 默认值是 511,可以通过修改配置文件设置其长度


若您的实例发生 TCP 全连接队列满导致丢包时,可通过以下步骤进行处理:

  1. 调大内核参数 net.core.somaxconn。内核参数详细信息请参见 Linux 实例常用内核参数介绍

  2. 检查业务进程是否传入了 backlog 参数。若是,则相应调大。


net.core.somaxconn   默认值 128


概念介绍
对于一个TCP链接,Server与Client需要通过三次握手来建立网络链接,当三次握手成功之后,我们就可以看到端口状态由LISTEN转为ESTABLISHED,接着这条链路上就可以开始传送数据了

net.core.somaxconn是Linux中的一个内核(kernel)参数,表示socket监听(listen)的backlog上限。
什么是backlog?backlog就是socket的监听队列,当一个请求(request)尚未被处理或者建立时,它就会进入backlog。
而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。
当Server处理请求较慢时,导致监听队列被填满后,新来的请求就会被拒绝。


对应三次握手结束,还没有 accept 队列时的 establish 状态。accept 队列较多则说明服务端 accept 效率不高,或短时间内突发了大量新建连接。该值过小会导致服务器收到 syn 不回包,是由于 somaxconn 表满而删除新建的 syn 连接引起。若为高并发业务,则可尝试增大该值,但有可能增大延迟。



如何查看该参数值

sysctl -a | grep net.core.somaxconn # 查看net.core.somaxconn参数


如何修改该参数值

sysctl -w net.core.somaxconn=1024   #立即生效,重启后失效


vim /etc/sysctl.conf
net.core.somaxconn=1024
sysctl -p


总结


如果Linux系统中部署了经常处理新请求(request)的高负载的服务,那么显然这个值是需要增加到更合适的值的,上面的修改调整后,再观察服务器的状态,看是否还有类似的问题



本文》有 0 条评论

留下一个回复