我正在调音sysctl.conf
。
根据优化指南在 linode 的网站上,以下是需要设置的合理值sysctl.conf
:
net.ipv4.tcp_max_syn_backlog = 3240000
但是,那相同值在 archlinux 优化指南中有这样一段话:
net.ipv4.tcp_max_syn_backlog = 65536
最后,在另一个优化博客(虽然很老了,但在 Google 上的 SEO 排名仍然很高),其价值被吹捧为:
net.ipv4.tcp_max_syn_backlog = 4096
所有这些球场都大不相同。将此值设置为高数字(而不是低数字)的原因是什么?哪一个应该是实际的“合理”值?
答案1
这主要取决于您服务器上的流量。有几个重要问题:
- 您预计处理多少个并发连接?
- 平均响应时间是多少?(如果生成响应需要 10-50 秒,即使没有 DDoS 攻击,您也很容易耗尽资源)。
- 你使用哪台服务器?
nginx
,,haproxy
varnish
您应该监控:
netstat -s | grep "SYNs to LISTEN"
这是您的服务器丢失数据包的症状(例如因为积压队列已满)。
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}'
获取统计数据的可读名称。您应该能够使用以下方法收集这些数据:电讯报,收集或者普罗米修斯。
内核调优
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
这意味着服务器已经8160
打开了 之外的文件3270712
。