7

我们遇到了一个问题,当相对少量的节点(16 到 24 个,但我们将来需要处理更多)同时尝试连接时,我们的传入客户端套接字连接被拒绝到我们的套接字服务器。

一些细节:

  • 服务器在 Windows 2008 或 7 上运行
  • 我们的主服务器是使用 ServerSocket 用 Ja​​va 编写的
  • 客户端也是在我们数据中心的网格节点上运行的 Windows

当我们尝试在网格上进行测试运行时,客户端节点尝试连接到服务器并发送一个 40-100K 的数据包,然后断开连接。使用 16 到 24 个节点,我们开始看到客户端连接无法连接到服务器的问题。鉴于这种设置,我们正试图处理最多 16-24 个并发客户端连接和失败,这对我们来说似乎根本不正确。

主服务器循环正在侦听常规的 SocketServer,当它获得连接时,它会生成一个新线程来处理连接,并立即返回以侦听套接字。我们还有一个虚拟的 python 服务器,它简单地读取和丢弃传入的数据,还有一个 C++ 服务器,它在转储数据之前记录数据,两者都遇到同样的问题,客户端无法连接,之前成功的客户端连接的数量有微小的变化失败开始。这使我们相信任何特定的服务器在这个问题上都没有错,它可能是环境问题。

我们的第一个想法是增加套接字上的 TCP 积压。即使被推到非常高的水平,这也没有缓解这个问题。Java SocketServer 的默认值是 50,远低于我们的处理能力。

我们已经在同一子网的机器之间运行了测试,并禁用了机器上的所有本地防火墙,以防 FW 对我们与服务器的连接进行速率限制;没有成功。

我们已经尝试在运行服务器的 Windows 机器上调整网络:

  • 减少 TimedWaitDelay,但没有效果(在我的 Python 测试中它不应该因为该测试只运行几毫秒)。
  • 将 MaxUserPort 增加到一个较大的值,大约 65000,但没有效果(这很奇怪,因为我的 Python 测试只发送 240 条消息,所以我什至不应该接近这种类型的限制)。
  • 将 TcpNumConnection 增加到一个较大的值(不记得确切的数字)。同样,我们一次不应该有超过 24 个连接,所以这不能是一个限制。
  • 启动“动态积压”功能,允许消息积压动态增加。我认为我们将最大连接数设置为 2000,最小连接数为 1000,但没有效果。同样,Python 不应建立超过 240 个连接,因此我们甚至不应该激活动态积压。
  • 除了上述禁用 TCP 端口的 Windows“自动调整”之外。再次,没有效果。

我的感觉是 Windows 以某种方式限制了入站连接的数量,但我们不确定要修改什么以允许更多的连接。网络上的代理限制连接速率的想法似乎也不正确。我们高度怀疑同时连接的数量是否会使物理 GB 网络超载。

我们很难过。有没有其他人遇到过这样的问题并找到了解决方案?

4

3 回答 3

1

很可能您受到操作系统的限制;您是否在系统日志中看到4226错误消息?

Windows 将并发连接尝试的数量限制为(我认为)10 个连接/秒 - 取决于操作系统版本(服务器版本的值最高为 50)

为了消除这种情况,您有两种可能性:

  • 使用十六进制编辑器直接在 system32/drivers 中编辑 tcpip.sys - 开玩笑 :)

  • 尝试编辑 [HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Lanmanserver \Parameters\MaxMpxCt(默认 = 10 个命令)条目。

如果您使用的版本不允许您设置该参数,您也可以尝试此修补程序。

您还可以尝试各种操作,例如操作系统使用的最大 TCB 数量、动态端口分配的端口范围等 - 尽管这些值足以满足您的需求。

于 2013-12-03T10:22:52.437 回答
1

众所周知,IIS 可以处理大量并发传入连接 - 远远大于您遇到的限制 - 使环境成为不太可能的来源。

如果,如您所指出的,增加 TCP 积压并不能改善情况,那么问题确实必须出在 accept() 行为中。您没有指出客户端是否收到各种错误或一致的错误。超时将支持这一点,而拒绝则表明积压的处理速度不够快。

您是否可以尝试将应用程序原型化为 ASPX 主机以更好地理解问题?

于 2013-12-01T16:48:43.623 回答
1

我会检查有多少连接处于 TCP 连接的 TIME_WAIT 状态。由于 TIME_WAIT 导致许多连接打开/关闭导致套接字耗尽,我已经看到了这种类型的问题。要检查它,请运行:

netstat -a
于 2013-07-04T19:46:07.193 回答