2

我的网络服务速度变慢了。我的(网络)服务在 gsoap 和托管 C++ 中。它不是托管的 IIS/apache,而是使用 xml。我的客户端在 .NET 中,服务计算时间很短(<0.1s 准备回复)。我希望该服务能够顺利、快速并具有良好的可用性。我有大约 100 个客户,响应时间是 1 秒。客户每分钟大约有 1 个请求。客户端通过 tcp 开放端口测试检查 Web 服务是否存在。因此,为了避免可能的拥塞,我将 gSoap KeepAlive 设置为 false。直到一切正常:我在 TCPView (sysinternals) 中看到连接

新的特殊同步程序现在循环调用该服务。它的负载更高,但所有内容都在不到 30 秒的时间内处理完毕。使用 sysinternals TCPView,我看到大约 1000 个连接处于 TIME_WAIT 中。他们减慢了服务速度,现在服务需要几秒钟才能回复。

难道是我需要重置 SoapHttpClientProtocol 连接?有人有 TIME_WAIT 鬼和一个循环的 Web 服务调用?

4

2 回答 2

1

听起来您没有在通话后关闭连接并在每个请求上打开新连接。关闭连接或重用打开的连接。

于 2009-02-05T08:23:59.873 回答
0

对上面提到的实现要非常小心。他们有严重的问题。

  1. yakkowarner.blogspot.com/2008/11/calling-web-service-in-loop.html(上面的评论)中描述的实现:

    问题:下次您使用 wsdl.exe 重新生成 Web 服务时,您的所有工作都将被清除,并且您将忘记您没有提到此修复程序依赖于消息字符串来采取行动的方法。

  2. forums.asp.net/t/1003135.aspx(上面的评论)中描述的实现:

    问题:您正在选择一个介于 5000 和 65535 之间的端点,因此从表面上看,这看起来是个好主意。如果您考虑一下,就没有办法(至少我想不到)您可以保留端口以供以后使用。您如何保证列表中的下一个端口当前未使用?您正在按顺序选择要使用的端口,如果其他一些应用程序选择了您列表中的下一个端口,那么您就完蛋了。或者,如果在您的客户端计算机上运行的其他一些应用程序开始使用随机端口进行连接怎么办——您将在不可预测的时间点被淹没。您会随机收到一条错误消息,例如“无法访问或不可用远程主机” - 更难排除故障。

尽管我无法为您提供解决此问题的正确方法,但您可以做的一些事情是:

  1. 尽量减少 Web 服务请求的数量或将它们分散到更长的时间段内
  2. 对于您的应用程序类型,Web 服务可能不是正确的架构 - 对于 1 毫秒响应时间的东西,您应该使用消息传递系统 - 而不是 Web 服务
  3. 使用注册表将您的操作系统允许的连接数设置为 65K,就像在 Windows 中一样
  4. 将您操作系统的套接字保留在 TIME_WAIT 中的时间设置为某个较低的数字(这提出了自己的问题列表)
于 2010-12-31T20:12:31.617 回答