Ubuntu Server 10.04.1 x86
我有一台机器在nginx后面有一个FCGI HTTP服务,它为很多不同的客户端提供了很多小的HTTP请求。 (在高峰时段每秒约230个请求,标题的平均响应大小为650字节,每天有数百万个不同的客户端。)
因此,我有很多套接字,挂在TIME_WAIT(graphics是用下面的TCP设置捕获的):
我想减less套接字的数量。
除此之外,我还能做什么?
$ 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(worker) --domain-socket - > fcgi-software --single-persistent-TCP-socket - > Redis --single-persistent-TCP-socket-> MySQL(其他机器)
我可能应该将load-balancer – > worker连接切换到域套接字,但有关TIME_WAIT套接字的问题仍然存在 – 我打算很快在另一台机器上添加第二个worker。 在这种情况下将无法使用域套接字。
你应该做的一件事就是修复net.ipv4.tcp_fin_timeout=1
。 这是低的方法,你可能不应该低于30。
由于这是nginx的后面。 这是否意味着nginx是作为一个反向代理? 如果是这种情况,那么你的连接是2x(一个给客户端,一个给你的web服务器)。 你知道这些sockets属于哪个端口吗?
更新:
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套接字时,无论最大桶数是多less,我都会看到TCP中断。
这个链接还表明TIME_WAIT状态是60秒,不能通过proc调整。
随机趣事实:
你可以用netstat -on | grep TIME_WAIT | less
查看每个socket的netstat时间等待时间 netstat -on | grep TIME_WAIT | less
重用与回收:
这些是有趣的,它看起来像重用使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
netstat -n | grep TIME_WAIT | wc -l
netstat -n | grep TIME_WAIT | wc -l
比Munin更快的反馈。
tcp_tw_reuse是相对安全的,因为它允许TIME_WAIT连接被重用。
如果用完端口是一个问题,您也可以在负载均衡器后面的不同端口上运行更多服务。