我们运行一个高stream量的网站。 在过去的几天里,我们有几个客户抱怨我们无法复制的零星停机时间。 我们有几个networking服务器被选为接收来自我们的负载均衡器的stream量,而在调查时,我意识到所有的服务器每秒下降超过20个连接。 一个服务器的连接示例如下所示:
38452 TIME_WAIT 7815 ESTABLISHED 570 FIN_WAIT2 105 FIN_WAIT1 101 LAST_ACK 36 SYN_RECV 25 CLOSING 4 SYN_SENT 2 CLOSE_WAIT 1 Foreign
我们configuration的端口范围目前在所有服务器上设置为15000 61000 。 那么,因为build立或等待closures的连接数量等于46267,所以所有可能的端口都必须耗尽。
在调查stream量的同时,我们应该怎样处理丢失的连接? 增加我们的港口范围可能是明智的吗? 减lessclosures连接等待的时间? 都? 会做有任何潜在的负面后果?
有几种方法可以解决这个问题。
最简单的方法是增加短暂的范围,但你已经这样做了,而且这个解决scheme有多远,你可以走多远。
另一种解决scheme是循环DNS,并为您的负载平衡器节点添加多个IP地址。 有时这并不容易(您需要等待获得更多的IP,等待DNS传播时间等)。
在考虑其他长期解决scheme时,您可以立即安全地做两件事,那就是降低TCP定时器并打开tcp_reuse。
tcp_reuse在负载平衡器上使用是非常安全的,它所做的是使内核能够在TIME_WAIT状态下重新使用套接字来进行新的连接。 要打开它,请在你的linux机器上运行:
# sysctl -w net.ipv4.tcp_tw_reuse=1
为了使其持久启动:
# echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.d/net.ipv4.tcp_tw_reuse.conf
另一个可能帮助的内核调优参数是:
另外,您可以将net.ipv4.tcp_fin_timeout降至1或2(如果主机是一个closures连接,则将套接字保持在FIN-WAIT-2状态多久)。
希望能帮助到你。