linux内核参数之net.core.somaxconn
Tags: Linuxnet.core.somaxconnOS内核参数调优
内核参数net.core.somaxconn 介绍
该参数是Linux 操作系统全局参数,每个 TCP 监听端口的队列长度。
1)概念介绍
对于一个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 连接引起。若为高并发业务,则可尝试增大该值,但有可能增大延迟。
2)补充
Linux系统中,该参数的值默认是128
如果Linux系统中部署了经常处理新请求(request)的高负载的服务,那么显然这个值是需要增加到更合适的值的
1.官方描述
The Linux Kernel
somaxconn - INTEGER
Limit of socket listen() backlog, known in userspace as SOMAXCONN. Defaults to 4096. (Was 128 before linux-5.4) See also tcp_max_syn_backlog for additional tuning for TCP sockets.
- In RHEL 6 & RHEL 7, the sk_max_ack_backlog field of the sock
structure is defined as unsigned short which limits the values to 16
bits whose maximum value is 65535. - In RHEL 8, sk_max_ack_backlog
field of the sock structure is defined as u32 which limits the values
to 32 bits whose maximum value is 2147483647.
2.不同应用的配置建议
- Number of clients: Set somaxconn should be set to at least 1024 to
allow for a large number of client server connections. - Number of queued packets: Set netdev_max_backlog to at least 32768 to minimize packet loss.
2.2.ZooKeeper
On linux, below parameter :
net.core.somaxconn
needs to be larger than above “clientPortBacklog” to correctly configure listen socket backlog
2.3.TiDB
检查各项内核参数的值:
…
net.core.somaxconn: 32768
2.4.Nginx
Increase the value of the net.core.somaxconn kernel parameter from its default value (128) to a value high enough for a large burst of traffic. In this example, it’s increased to 4096.
如何查看该参数值
1)查看所有内核参数及值
1 2 3 4 5 6 7 8 9 | sysctl -a # 查看所有内核参数及值 1 [root@localhost core]# sysctl -a | head -n 5 kernel.sched_child_runs_first = 0 kernel.sched_min_granularity_ns = 1000000 kernel.sched_latency_ns = 5000000 kernel.sched_wakeup_granularity_ns = 1000000 kernel.sched_tunable_scaling = 1 [root@localhost core]# |
2)查看net.core.somaxconn参数
1 2 3 4 5 6 7 8 9 10 | sysctl -a | grep net.core.somaxconn # 查看net.core.somaxconn参数 1 [root@localhost core]# sysctl -a | grep net.core.somaxconn net.core.somaxconn = 128 [root@localhost core]# [newgp@mdw2 ~]$ cat /proc/sys/net/core/somaxconn 128 [newgp@mdw2 ~]$ |
该参数值默认是128
如何修改该参数值
1)立即生效
1 2 3 4 5 6 7 8 9 | sysctl -w net.core.somaxconn=1024 1 [root@localhost core]# sysctl -a | grep net.core.somaxconn net.core.somaxconn = 128 [root@localhost core]# sysctl -w net.core.somaxconn=1024 net.core.somaxconn = 1024 [root@localhost core]# sysctl -a | grep net.core.somaxconn net.core.somaxconn = 1024 [root@localhost core]# |
该方法在重启系统之后会失效,参数值重新恢复成最初的128
2)永久生效
在/etc/sysctl.conf
文件中新增一行 net.core.somaxconn=1024
;执行sysctl -p
1 2 | echo "net.core.somaxconn = 10240" >>/etc/sysctl.conf sysctl -p |
配置方法
3.1.临时生效
1 | sysctl -w net.core.somaxconn=10240 |
3.2.永久生效
1 2 | echo "net.core.somaxconn = 10240" >>/etc/sysctl.conf sysctl -p |
TCP 全连接队列满
TCP 全连接队列的长度取 net.core.somaxconn
及业务进程调用 listen 时传入的 backlog 参数,两者中的较小值。若您的实例发生 TCP 全连接队列满导致丢包时,可通过以下步骤进行处理:
- 调大内核参数
net.core.somaxconn
。内核参数详细信息请参见 Linux 实例常用内核参数介绍。 - 检查业务进程是否传入了 backlog 参数。若是,则相应调大。
参考
https://blog.csdn.net/qq_31851107/article/details/103497779
https://cloud.tencent.com/document/product/213/57336#upperLimit
https://blog.csdn.net/tiancityycf/article/details/122565051