清漆用尽开放端口,大量SYN_SENT连接


8

最近,我们的Varnish(3x)-> Apache(3x)设置遇到了问题,导致SYN_SENT连接数量激增。

高峰本身是由于到达站点的新流量(不是任何类型的DDOS)造成的,并且似乎我们的Varnish机器在将流量转发到后端服务器时遇到问题(Apache流量下降与清漆的峰值相关),从而使可用端口池拥塞SYN_SENT

在Apache(15s)上启用了保持活动状态。

故障在哪一边?流量很大,但绝不会导致此类设置(3台Varnish前端计算机,3台后端Apache服务器)停顿。

请帮忙。

通过防火墙的Munin屏幕截图在这里

~$ netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

      9 CLOSE_WAIT
     12 CLOSING
    718 ESTABLISHED
     39 FIN_WAIT1
   1714 FIN_WAIT2
     76 LAST_ACK
     12 LISTEN
    256 SYN_RECV
   6124 TIME_WAIT

/etc/sysctl.conf(消失)

net.ipv4.netfilter.ip_conntrack_max = 262144
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_fin_timeout = 30

阿帕奇 netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

     11 CLOSE_WAIT
    286 ESTABLISHED
     38 FIN_WAIT2
     14 LISTEN
   7220 TIME_WAIT

/etc/sysctl.conf(Apache)

vm.swappiness=10
net.core.wmem_max = 524288
net.core.wmem_default = 262144
net.core.rmem_default = 262144
net.core.rmem_max = 524288
net.ipv4.tcp_rmem = 4096 262144 524288
net.ipv4.tcp_wmem = 4096 262144 524288
net.ipv4.tcp_mem = 4096 262144 524288

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_keepalive_time = 30

net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.core.somaxconn = 2048


net.ipv4.conf.lo.arp_ignore=8
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

vm.swappiness = 0

kernel.sysrq=1
kernel.panic = 30

1
防火墙在哪里?唯一具有较高SYN_SENT统计信息的系统是防火墙;您是说防火墙似乎是瓶颈吗?
Shane Madden

SYN_SENT高的防火墙位于Varnish计算机上。
user150997

更多eth / conntrack统计信息在这里:grab.by/iA2M
user150997

1
您的/ proc / sys / net / ipv4 / tcp_max_tw_buckets和tcp_max_syn_backlog设置为什么?(我的是180000,这是180k的等待时间和1024(存在更多内存时增加))。另外,为什么还要打开tw_recycle?那会不会导致错误?(还是回收?)
Grizly

1
您可能需要考虑将net.ipv4.tcp_tw_recycle设置为零-特别是在负载平衡的情况下。启用此功能后,我在并发性方面遇到了HAproxy的问题。另外,我会在测试期间禁用iptables。在负载平衡的环境中使用连接跟踪时,我看到了一些奇怪的结果。
jeffatrackaid

Answers:


3

您的问题可能与Apache服务器上的sysctl有关。

一些假设:通常,Varnish在处理每个连接方面比Web服务器快得多(除非您的Varnish服务器的CPU少得多,并且Apache服务器仅提供缓存在内存中的静态文件。)我将假设您的连接处理速度更快在Varnish中比在Apache中。

因此,Apache服务器上的资源可能很充足,但是请求必须排在某个地方,即使只是非常短暂。目前,他们并没有以健康的方式排队等待最终得到处理。

似乎您的请求被卡在Varnish中,而不是进入Apache服务器。

有一些证据表明:

请注意,在您的munin图中,在备份SYN_SENT之前,TIME_WAIT中的请求增加,然后经过一个点,它们开始堆积为SYN_SENTS。这表明请求开始被响应的速度变慢了,然后队列又备份了,请求根本没有得到响应。

这向我表明您的Apache服务器未接受足够的连接(然后他们可以坐在那里排队等待Apache处理它们)。

我在您的配置文件中看到了几个可能的限制:

当出现峰值时,您的Varnish服务器上大约有30000个连接处于SYN_SENT状态。

但是,在Apache服务器上,您的max_syn_backlog只有16384。您的somaxconn只有2048。

还要注意,Apache服务器上网络内存缓冲区的大小非常小。您已将它们在Varnish服务器上调整为16MB。但是在Apache服务器上,您的net.ipv4.tcp_rmem只有524KB才能匹配您的net.core.rmem_max。

我建议在Apache服务器上提高所有这些参数。

您将需要更多地专注于Apache服务器上的诊断以准确了解正在发生的事情,但是如果您提高这些值,则可能不需要。

您可能不应该调整net.ipv4.tcp_mem。请注意,此参数的单位是页,而不是字节,因此从net.ipv4.tcp_rmem或net.ipv4.tcp_wmem复制相同的值(均以字节为单位)没有任何意义。它会根据您的内存量由linux自动调整,因此很少需要调整。实际上,这可能是您的问题,任意限制可用于整个连接排队的内存。

参见:http : //russ.garrett.co.uk/2009/01/01/linux-kernel-tuning/

还要注意,两次设置了“ vm.swappiness = 0”,一次设置为10,最后一次设置为0,这是有效值。


0

在Varnish服务器上,尝试更改以下2个参数:

net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1

tw_reuse将允许它在TIME_WAIT中重用连接。

tw_recycle可能导致负载均衡器等问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.