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

最近我们遇到了Varnish(3x) – > Apache(3x)安装的问题,导致SYN_SENT连接数量猛增。

这个峰值本身是由于新的stream量触及网站(而不是任何types的DDOS),而且似乎我们的Varnish机器在将stream量转发到后端服务器时出现问题(Apachestream量下降与清漆上的尖峰相关),拥塞SYN_SENT的可用端口池。

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

哪一方是错的? stream量很大,但是不应该导致这样的设置(3x Varnish前端机器,3x后端Apache服务器)停顿。

请帮忙。

Munin截图通过防火墙连接在这里 。

varnish〜 ~$ 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(Varnish)

 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 

Apache 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 

你的问题可能是Apache服务器上的sysctl。

一些假设:通常Varnish在处理每个连接时比web服务器快得多(除非你的Varnish服务器的CPU数量less得多,而你的Apache服务器只提供caching在内存中的静态文件)。我将假设你的连接处理速度更快在清漆比Apache。

因此,您的Apache服务器上的资源可能充足,但是请求将不得不在某个地方排队,如果只是非常短暂的话。 现在他们不是以一种健康的方式排队,最终得到处理。

看起来好像你的请求被困在Varnish中,而不是把它交给Apache服务器。

有这样的证据:

注意在你的munin图中,在SYN_SENTs被备份之前,TIME_WAIT中的请求增加,然后在一个点之后,它们开始堆积为SYN_SENTS。 这表明请求开始被更慢地回答,然后队列备份,请求根本得不到回答。

这表明你的Apache服务器没有接受足够的连接(他们可以坐在那里等待Apache处理它们)。

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

当你有秒杀时,在你的Varnish服务器上你有大约30000 SYN_SENT状态的连接。

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

另请注意,Apache服务器上的networking内存缓冲区的大小非常低。 你已经把它们在Varnish服务器上调整为16MB。 但是在Apache服务器上,你的net.ipv4.tcp_rmem只有524KB,可以和你的net.core.rmem_max匹配。

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

您将需要更多地关注Apache服务器上的诊断信息,以确切了解到底发生了什么,但如果您提高这些值,则可能不需要。

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

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

另外注意你的“vm.swappiness = 0”被设置两次,一次为10次,再次在底部为0,这是有效值。

在清漆服务器上,尝试更改这两个参数:

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

tw_reuse将允许它重新使用TIME_WAIT中的连接。

tw_recycle可能会导致负载平衡器等问题