处于CLOSE_WAIT状态的许多套接字服务无响应

时间:2013-09-26 07:28:25

标签: wcf nettcpbinding servicehost

我有一个WCF服务,NetTcpBinding运行着大约100个客户端。客户定期从服务器轮询信息,一段时间后服务不再响应。

查看netstat,我可以看到许多处于CLOSE_WAIT状态的连接。

这是我的约束力:

<netTcpBinding>
  <binding  name="default" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxConnections="10000">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
  </binding>
</netTcpBinding>

我还尝试将 closeTimeout 的值从默认值00:01:00更改为 00:00:10 ,但没有效果。

该计算机是Windows Server 2008 R2 64位。

更新

我现在添加了ServiceThrottlingBehavior,但结果仍然相同。

new ServiceThrottlingBehavior
{
 MaxConcurrentCalls = 1000,
 MaxConcurrentInstances = 1000,
 MaxConcurrentSessions = 1000
};

UPDATE2

我已将SessionMode设置为NotAllowed并将绑定更改为流式传输。

我可以做些什么来提高性能或找出问题?

4 个答案:

答案 0 :(得分:2)

从你的描述看来,似乎:1。最初客户端能够连接到你的服务器没有问题,所以这排除了配置问题2.一段时间服务器停止响应,但你没说多久,请求率有多大,服务器是否完全停止响应,或者只是间歇性响应。基于这种可能性是服务器端出现问题。您是否注意到服务器端有什么异常?要寻找的是:

  1. 线程计数 - 是描述的线程池(作为一些设置 可以在线程池线程上设置上限)?特别是尝试新的发布 服务器并观察线程数直到它停止 响应,那里有任何模式吗?你可能有死锁,很久 阻塞操作等,持有太长时间的线程。
  2. 内存 - 内存泄漏是否存在问题?
  3. 是自助托管服务吗?你有适当的代码来捕获ServiceHost.Faulted事件(和 重启服务)?如果ServiceHost出现故障,它将不会响应 对任何要求。
  4. 查看WCF performance counter告诉您的内容,尤其是队列大小和活动连接数。从性能计数器,您将知道服务是否正在接受任何请求,或者您是否进行了限制 配置是必要的。
  5. 最终诊断工具:打开服务端WCF tracing?打开一个跟踪文件 肯定告诉你请求发生了什么。如果你看到任何 跟踪文件中的异常,您将找到根本原因。

答案 1 :(得分:0)

听起来你的客户永远不会断开连接。

  1. 您确定您的客户正在关闭频道吗?请注意,您应该调用ChannelFactory.Close,而不仅仅是Dispose。

  2. 将receiveTimeout设置为低,以验证这是问题所在。

答案 2 :(得分:0)

您的客户端通过调用close()来关闭连接,后者将FIN发送到服务器套接字,服务器套接字确认FIN并且其状态现在已更改为CLOSE_WAIT,并保持该状态,除非服务器发出close()调用插座。

您的服务器程序需要检测客户端是否已中止连接,然后立即关闭()以释放端口。怎么样?请参阅read()。在读取文件结尾(意味着收到FIN)时,返回零。

您可以检测客户端是否已断开连接。

任何WCF渠道都会实施 ICommunicationObject ,它会为渠道生命周期提供事件。

你应该听Faulted事件 可以从OperationContext.Current属性一直访问sessionId。 当您的客户打开频道时(在第一次操作时),注册适当的事件:

OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted);
OperationContext.Current.Channel.Closed += new EventHandler(Channel_Faulted);

void Channel_Faulted(object sender, EventArgs e)
 {
     Logout((IContextChannel)sender);
 }

 protected void Logout(IContextChannel channel)
 {
        string sessionId = null;

        if (channel != null)
        {
            sessionId = channel.SessionId;
        }
 }

如果套接字断开,则应该获得通道故障事件。当客户端正常关闭时会引发Closed事件,在意外发生时会出现故障(如网络故障)。

查看以下链接..它的类似。它帮助了我..

TCP Socket Server Builds Up CLOSE_WAITs Occasionally Over Time Until Inoperable

答案 3 :(得分:0)

验证路由器不是问题,因为某些消费级路由器对允许的开放套接字/连接数有限制。