在尝试并行建立大量 TCP 连接时,我观察到一些奇怪的行为,我认为这是gen_tcp
.
该场景是一个服务器在具有多个并发接受器的端口上侦听。从客户端我通过调用建立连接gen_tcp:connect/3
,然后我向服务器发送“Ping”消息并在被动模式下等待“Pong”响应。当按顺序执行“get_tcp:connect/3”调用时,一切正常,包括大量连接(我测试了高达 ~ 28000)。
尝试并行建立大量连接时会出现问题(取决于大约 75 到数百之间的机器)。虽然大多数连接仍然建立,但一些连接失败并closed
出现gen_tcp:recv/3
. 奇怪的是,这些连接之前没有失败,调用gen_tcp:connect/3
和gen_tcp:send/2
都成功(即返回ok
)。在服务器端,我没有看到这些“奇怪”连接的匹配连接,即没有返回gen_tcp:accept/1
。我的理解是,成功的“get_tcp:connect/3”应该会导致服务器端匹配接受的连接。
我已经提交了一个错误报告,在那里你可以找到更详细的描述和一个最小的代码示例来演示这个问题。我能够在 Linux 和 Mac OS X 以及不同的 Erlang 版本上重现该问题。
我的问题是:
- 是否有人能够重现该问题并可以确认这是错误行为?
- 任何解决方法的想法?如何处理这个问题,其他顺序启动所有连接(这需要永远)?