如何减少TIME_WAIT中的套接字数量?


36

Ubuntu服务器10.04.1 x86

我有一台在nginx后面带有FCGI HTTP服务的机器,该机器为许多不同的客户端提供许多小的HTTP请求。(在高峰时段每秒大约有230个请求,带有标头的平均响应大小为650字节,每天有数百万个不同的客户端。)

结果,我有很多套接字挂在TIME_WAIT中(下面的TCP设置捕获了该图):

时间的等待

我想减少插座的数量。

除此之外,我还能做什么?

$ cat / proc / sys / net / ipv4 / tcp_fin_timeout
1个
$ cat / proc / sys / net / ipv4 / tcp_tw_recycle
1个
$ cat / proc / sys / net / ipv4 / tcp_tw_reuse
1个

更新:有关计算机上实际服务布局的一些详细信息:

客户端----- TCP-socket-> nginx(负载均衡器反向代理) 
       ----- TCP-socket-> nginx(工作者) 
       --domain-socket-> fcgi-软件
                          --single-persistent-TCP-socket-> Redis
                          --single-persistent-TCP-socket-> MySQL(其他机器)

我可能也应该将负载平衡器->工作程序连接也切换到域套接字,但是有关TIME_WAIT套接字的问题仍然存在-我计划很快在另一台计算机上添加第二个工作程序。在这种情况下将无法使用域套接字。


Munin似乎在撒谎。查看对Kyle答案的评论。现在看。
亚历山大·格拉迪什

1
创建一个问题关于穆宁:serverfault.com/questions/212200/...
亚历山大Gladysh

现在看来Munin并不是在撒谎,而是我在看错情节……
Alexander Gladysh 2010年

Answers:


28

开始时应做的一件事是修复.NET net.ipv4.tcp_fin_timeout=1。那是降低的方法,您可能不应该将其降低到30以下。

由于这是nginx的背后。这是否意味着nginx充当反向代理?如果是这种情况,则您的连接是2倍(一个到客户端,一个到您的Web服务器)。您知道这些插座属于哪一端吗?

更新:
fin_timeout是它们在FIN-WAIT-2中停留的时间(来自networking/ip-sysctl.txt内核文档):

tcp_fin_timeout - INTEGER
        Time to hold socket in state FIN-WAIT-2, if it was closed
        by our side. Peer can be broken and never close its side,
        or even died unexpectedly. Default value is 60sec.
        Usual value used in 2.2 was 180 seconds, you may restore
        it, but remember that if your machine is even underloaded WEB server,
        you risk to overflow memory with kilotons of dead sockets,
        FIN-WAIT-2 sockets are less dangerous than FIN-WAIT-1,
        because they eat maximum 1.5K of memory, but they tend
        to live longer. Cf. tcp_max_orphans.

我认为您可能只需要让Linux保持TIME_WAIT套接字号与它们上的32k上限相抵,这就是Linux回收它们的地方。此链接中提到了32k :

另外,我发现/ proc / sys / net / ipv4 / tcp_max_tw_buckets令人困惑。尽管默认设置为180000,但无论系统上有两个最大存储桶,当系统上有32K TIME_WAIT套接字时,我都会看到TCP中断。

此链接还建议TIME_WAIT状态为60秒,不能通过proc进行调整。

随机有趣的事实:
您可以使用netstat在timewait上看到每个套接字的计时器,netstat -on | grep TIME_WAIT | less

Reuse Vs Recycle:
这很有趣,它看起来像重用,启用了time_Wait套接字的重用,并且将其重设为TURBO模式:

tcp_tw_recycle - BOOLEAN
        Enable fast recycling TIME-WAIT sockets. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

tcp_tw_reuse - BOOLEAN
        Allow to reuse TIME-WAIT sockets for new connections when it is
        safe from protocol viewpoint. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

我不建议使用net.ipv4.tcp_tw_recycle,因为它会导致NAT客户端出现问题

也许您可能不尝试同时打开这两个功能,然后查看其效果(一次尝试一个,看看它们如何独立工作)?我会使用netstat -n | grep TIME_WAIT | wc -l比Munin更快的反馈。


1
@Kyle:net.ipv4.tcp_fin_timeout您会推荐什么价值?
亚历山大·格拉迪什

1
@Kyle:客户端--TCP套接字-> nginx(负载均衡器反向代理)-TCP套接字-> nginx(工作者)-域套接字-> fcgi软件
Alexander Gladysh 2010年

2
我会说30还是也许20。试试看。您有很多负担,所以很多TIME_WAIT都是有意义的。
凯尔·勃兰特

1
@Kyle:对不起,一个愚蠢的问题(我在货物邪教级到这里为止,不幸的是),但究竟是什么,我应该希望看到当我改变net.ipv4.tcp_fin_timeout来自120
亚历山大·格拉迪什

4
哦,这是一个很好的衬板:netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c。因此,@ Alex,如果Munin不喜欢它,也许可以深入研究它如何监视这些统计数据。也许唯一的问题是Munin正在为您提供不良数据:-)
Kyle Brandt 2010年

1

tcp_tw_reuse相对安全,因为它允许TIME_WAIT连接被重用。

如果端口用完了,还可以在负载均衡器后面的不同端口上运行更多的服务。

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.