sysctl.conf 中 net.ipv4.tcp_max_syn_backlog 的合理值

Has*_*aig 13 linux ubuntu sysctl

我在调sysctl.conf

根据linode 网站上的优化指南,以下是要设置的合理值sysctl.conf

net.ipv4.tcp_max_syn_backlog = 3240000
Run Code Online (Sandbox Code Playgroud)

但是,archlinux 优化指南中的相同值是:

net.ipv4.tcp_max_syn_backlog = 65536
Run Code Online (Sandbox Code Playgroud)

最后,在另一个优化博客上(虽然很旧,但在谷歌上的 SEO 仍然很高),其价值被吹捧为:

net.ipv4.tcp_max_syn_backlog = 4096
Run Code Online (Sandbox Code Playgroud)

所有这些球场都大不相同。将此值设置为高数(与低数相比)背后的原因是什么?哪一个应该是真正的“理智”价值开始?

Tom*_*art 11

这主要取决于您通过服务器运行的流量。有几个重要的问题:

  • 您希望处理多少并发连接?
  • 平均响应时间是多少?(如果生成响应需要 10-50 秒,即使没有 DDoS 攻击,您也可能很容易耗尽资源)。
  • 你使用哪个服务器?nginx, haproxy,varnish

您应该监控:

netstat -s | grep "SYNs to LISTEN"
Run Code Online (Sandbox Code Playgroud)

这是您的服务器正在丢弃数据包的症状(因为例如积压队列已满)。

Netstat 统计信息导出到/proc/net/netstat调用 stat 的位置ListenDrops。用脚本解析可能更容易,或者使用类似的东西:

cat /proc/net/netstat | awk '(f==0) { i=1; while ( i<=NF) {n[i] = $i; i++ }; f=1; next} \
    (f==1){ i=2; while ( i<=NF){ printf "%s = %d\n", n[i], $i; i++}; f=0}'
Run Code Online (Sandbox Code Playgroud)

获得人类可读的统计名称。您应该能够收集例如,使用该数据telegrafcollectd普罗米修斯

内核调优

net.ipv4.tcp_max_syn_backlog- ? 队列中可以保留多少个客户端尚未发送 ACK 响应的半开连接(源)

net.core.somaxconn 可以排队接受的最大连接数

net.core.netdev_max_backlog 接收队列中通过网络接口并等待内核处理的最大数据包数。

这些设置与打开的文件数量紧密相关(如在 Linux 中,每个新连接将打开 2 个文件句柄)。您可以使用以下方法检查您的限制:

cat /proc/sys/fs/file-nr
8160    0       3270712
Run Code Online (Sandbox Code Playgroud)

这意味着服务器8160已从3270712.