我们正在尝试优化一个应用程序,该应用程序通过TCP接受消息,并将TCP用于其内部消息传递。在进行负载测试时,我们注意到,随着对系统提出更多的同时请求,响应时间显著缩短(然后完全停止)。在此期间,我们看到许多TCP连接处于TIME_WAIT状态,有人建议将TIME_WAIT环境变量从默认的60秒降至30秒。
在我所理解的中,TIME_WAIT设置实质上设置了连接关闭后系统再次可用的TIME_WAIT资源的时间。
我不是“网络迷”,对这些事情知之甚少。我需要很多链接帖子里的东西,但是有点“哑口无言”。
TIME_WAIT值设置为0,但它能安全地设置为5吗?十块怎么样?是什么决定了这个值的“安全”设置?发布于 2008-12-03 13:46:17
TCP连接由元组(源IP、源端口、目标IP、目标端口)指定。
会话关闭后出现TIME_WAIT状态的原因是,网络中可能仍有活动数据包正在向您发送(或来自您,这可能会引起某种响应)。如果要重新创建相同的元组,并且出现其中一个包,它将被视为连接的有效数据包(并且可能会导致排序错误)。
因此,通常将TIME_WAIT时间设置为数据包最大年龄的两倍。此值是允许数据包在网络丢弃之前到达的最大年龄。
这可以保证,在允许您使用相同的元组创建连接之前,属于该元组先前化身的所有数据包都将死亡。
这通常指示您应该使用的最小值。最大分组年龄由网络属性决定,例如,卫星寿命高于LAN生命周期,因为数据包还有更长的路要走。
发布于 2008-12-03 15:40:34
通常,只有发出“活动关闭”的端点才会进入TIME_WAIT状态。因此,如果可能的话,让客户端发出活动关闭,这将使TIME_WAIT留在客户端而不是服务器上。
请参阅这里:http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html和http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/获得详细信息(后者还解释了为什么由于没有将TIME_WAIT考虑在内的协议设计而不总是可能的)。
发布于 2008-12-03 14:05:28
Pax对于TIME_WAIT的原因是正确的,以及为什么您应该谨慎地降低默认设置。
更好的解决方案是改变用于套接字起始端的端口号。一旦您这样做了,您就不会真正关心等待单个套接字的时间。
对于侦听套接字,您可以使用SO_REUSEADDR来允许侦听套接字绑定,尽管TIME_WAIT套接字位于附近。
https://stackoverflow.com/questions/337115
复制相似问题