[转帖]net.ipv4.tcp_max_syn_backlog & net.core.somaxconn

net,ipv4,tcp,max,syn,backlog,core,somaxconn · 浏览次数 : 0

小编点评

**内容生成指令** **参数** * tcp_max_syn_backlog **意义** 该参数用于设置请求高峰时可接受的 SYN 队列长度,如果该值设置太低,可能会导致无法连接服务器的错误。 **示例** *如果设置 tcp_max_syn_backlog 参数为 1024,表示在请求高峰时可接受的 SYN 队列长度不超过 1024,则服务器能够处理 1024 个请求。 **其他提示** *这参数通常在内核参数中设置,可以通过 `CONFIG_SYN_COOKIES` 参数设置。 *如果设置 tcp_max_syn_backlog 参数时,请确保其他参数设置合理,例如 `tcp_synack_retries` 参数。 *如果设置 tcp_max_syn_backlog 参数时,请确保您服务器能够处理所设置的队列长度。

正文

https://www.cnblogs.com/apink/p/15632882.html

 

TCP SYN_REVD, ESTABELLISHED 状态对应的队列

TCP 建立连接时要经过 3 次握手,在客户端向服务器发起连接时,对于服务器而言,一个完整的连接建立过程,服务器会经历 2 种 TCP 状态:SYN_REVD, ESTABELLISHED

对应也会维护两个队列:

  1. 一个存放 SYN 的队列(半连接队列)
  2. 一个存放已经完成连接的队列(全连接队列)

当一个连接的状态是 SYN RECEIVED 时,它会被放在 SYN 队列中

当它的状态变为 ESTABLISHED 时,它会被转移到另一个队列。所以后端的应用程序只从已完成的连接的队列中获取请求

如果一个服务器要处理大量网络连接,且并发性比较高,那么这两个队列长度就非常重要了。因为,即使服务器的硬件配置非常高,服务器端程序性能很好,但是这两个队列非常小,那么经常会出现客户端连接不上的现象,因为这两个队列一旦满了后,很容易丢包,或者连接被复位。所以,如果服务器并发访问量非常高,那么这两个队列的设置就非常重要了。

Linux backlog 参数意义

对于 Linux 而言,基本上任意语言实现的通信框架或服务器程序在构造 socket server 时,都提供了 backlog 这个参数,因为在监听端口时,都会调用系统底层 API: int listen(int sockfd, int backlog);

listen 函数中 backlog 参数的定义如下:

Now it specifies the queue length for completely established sockets waiting to be accepted,instead of the number of incomplete connection requests. The maximum length of the queue for incomplete sockets can be set using the tcp_max_syn_backlog sysctl. When syncookies are enabled there is no logical maximum length and this sysctl setting is ignored.If the socket is of type AF_INET, and the backlog argument is greater than the constant SOMAXCONN(128 default), it is silently truncated to SOMAXCONN.

backlog 参数描述的是服务器端 TCP ESTABELLISHED 状态对应的全连接队列长度。

ESTABLISHED列长度如何计算?

如果 backlog 大于内核参数 net.core.somaxconn,则以 net.core.somaxconn 为准,

即全连接队列长度 = min(backlog, 内核参数 net.core.somaxconn),net.core.somaxconn 默认为 128。

这个很好理解,net.core.somaxconn 定义了系统级别的全连接队列最大长度,

backlog 只是应用层传入的参数,不可能超过内核参数,所以 backlog 必须小于等于 net.core.somaxconn。

SYN_RECV队列长度如何计算?

半连接队列长度由内核参数 tcp_max_syn_backlog 决定,

当使用 SYN Cookie 时(就是内核参数 net.ipv4.tcp_syncookies = 1),这个参数无效,

半连接队列的最大长度为 backlog、内核参数 net.core.somaxconn、内核参数 tcp_max_syn_backlog 的最小值。

即半连接队列长度 = min(backlog, 内核参数 net.core.somaxconn,内核参数 tcp_max_syn_backlog)。

这个公式实际上规定半连接队列长度不能超过全连接队列长度,但是tcp_syncooking默认是启用的,如果按上文的理解,那这个参数设置没有多大意义

其实,对于 Nginx/Tomcat 等这种 Web 服务器,都提供了 backlog 参数设置入口,当然它们都会有默认值,通常这个默认值都不会太大(包括内核默认的半连接队列和全连接队列长度)。如果应用并发访问非常高,只增大应用层 backlog 是没有意义的,因为可能内核参数关于连接队列设置的都很小,一定要综合应用层 backlog 和内核参数一起看,通过公式很容易调整出正确的设置

以上都是引用文档,官方文档如下

tcp_syncookies - BOOLEAN

Only valid when the kernel was compiled with CONFIG_SYN_COOKIES Send out syncookies when the syn backlog queue of a socket overflows. This is to prevent against the common 'SYN flood attack'

Default: 1

Note, that syncookies is fallback facility. It MUST NOT be used to help highly loaded servers to stand against legal connection rate. If you see SYN flood warnings in your logs, but investigation shows that they occur because of overload with legal connections, you should tuneanother parameters until this warning disappear. See: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.

大致的意思,这个参数在请求高峰时,无法判断是不是合法正常的请求,当检查到SYN flood时首先排查一下原因。建议使用tcp_max_syn_backlog解除告警信息

syncookies seriously violate TCP protocol, do not allow to use TCP extensions, can result in serious degradation of some services (f.e. SMTP relaying), visible not by you, but your clients and relays, contacting you. While you see SYN flood warnings in logs not being really flooded, your server is seriously misconfigured.

If you want to test which effects syncookies have to your network connections you can set this knob to 2 to enable unconditionally generation of syncookies.

 参数文献


https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/

与[转帖]net.ipv4.tcp_max_syn_backlog & net.core.somaxconn相似的内容:

[转帖]net.ipv4.tcp_max_syn_backlog & net.core.somaxconn

https://www.cnblogs.com/apink/p/15632882.html TCP SYN_REVD, ESTABELLISHED 状态对应的队列 TCP 建立连接时要经过 3 次握手,在客户端向服务器发起连接时,对于服务器而言,一个完整的连接建立过程,服务器会经历 2 种 TCP 

[转帖]net.ipv4.tcp_max_tw_buckets 配置说明

https://www.jianshu.com/p/b7e991be0909 因为前些天遇到大量 TIME_WAIT 导致端口耗尽服务异常的情况,让我注意到这个参数。先说它的作用:在 TIME_WAIT 数量等于 tcp_max_tw_buckets 时,不会有新的 TIME_WAIT 产生。 tc

[转帖]linux中内核的一个不错的参数somaxconn

最近发现很多内核优化参数都记不住了,写下文章来备记,方便以后查看. 编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) #设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数) net.ipv4.ip_conntrack_max = 25000000 #最大

[转帖]tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项

linux TIME_WAIT 相关参数: net.ipv4.tcp_tw_reuse = 0 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭net.ipv4.tcp_tw_recycle = 0 表示开启TCP连接中TIME-WAIT socket

[转帖]内核参数优化

net.ipv4.tcp_timestamps= 1 #服务器时间截,默念为1 net.ipv4.tcp_tw_reuse= 1 #服务器作为客户端时起作用,开启后time_wait在一秒内回收,(两端都要开启tw_timestamps=1时才有效) net.ipv4.tcp_tw_recycle=

[转帖]Linux内核调优

Linux服务器调优 转载于:https://blog.csdn.net/largetalk/article/details/16863689 安装一台新的Linux服务器之后都要做些配置调整工作,优化一下系统,以前零零碎碎记录过一些,这里集中整理一下。 Linux内核参数 net.ipv4.tcp

[转帖]一个简单的内核参数优化

一个简单的内核参数优化 作者:孤风孤影 https://www.bilibili.com/read/cv15200947/ 出处:bilibili net.ipv4.tcp_keepalive_time=600 #此参数表示TCP发送keepalive探测消息的间隔时间(秒) net.ipv4.tc

[转帖]Linux内核参数net.ipv4.ip_local_port_range对服务器连接数影响的正确解释

首先明确一下该参数的意义:net.ipv4.ip_local_port_range表示本机作为客户端对外发起tcp/udp连接时所能使用的临时端口范围。 对于TCP连接,本机所能发起的tcp连接数受四元组(源地址*源端口*目标地址*目标端口)限制。 而对于UDP连接,本机所能发起的udp连接数则受二

[转帖]CONNTRACK_MAX和HASHSIZE

关于linux中的CONNTRACK_MAX和HASHSIZE要注意的地方 如果在压力测试的时候,并发数增大,但无法完成测试,可以尝试调整下参数: vi /etc/sysctl.conf 在kernel2.6之前的添加项: net.ipv4.netfilter.ip_conntrack_max =

[转帖]限制内核 udp bad checksum 失败告警信息

问题描述 某系统 dmesg 信息中有如下内容频繁打印,冲掉了其它相关的信息,需要限制打印。 UDP: bad checksum. From 10.66.245.93:61525 to 255.255.255.255:137 ulen 58 相关代码 内核源码树中的文件名: net/ipv4/udp