我在尝试对自定义 node.js websocket 服务器进行负载测试时发现了这个问题,其中某些套接字无法连接(它们达到连接超时)。它似乎与当前负载无关,因为我也可以在单个客户端线程测试中随机获得失败。
这似乎与 node.js 无关,因为我也可以重现在同一台服务器上对 nginx 提供静态页面进行负载测试时出现的问题。总体失败率似乎在 7-10% 的入站连接失败之间。
这似乎不是我本地客户端机器或互联网连接的问题,因为我可以从不同位置的另一台机器上重现该问题。
我检查了所有正常的可调参数(somaxconn、最大打开文件数等),据我所知,我还没有达到任何限制。我没有在系统日志中看到与此问题相关的任何条目。我还尝试完全禁用 iptables 以防止出现任何防火墙问题。
该服务器是 Ubuntu LTS 16.04(i7,32GB),是托管设施的专用机器。在联系他们之前,我想看看能否找到更多数据,看看这是操作系统级别、机器级别还是网络级别的问题。
我能够捕获失败连接的 tcpdump,但我不太清楚该如何处理它:
07:19:29.952730 IP localmachine.53949 > server.30312: Flags [S], seq 2408213894, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
07:19:29.952879 IP server.30312 > localmachine.53949: Flags [S.], seq 1245200353, ack 2408213895, win 28200, options [mss 1410,nop,nop,sackOK,nop,wscale 7], length 0
07:19:30.951778 IP server.30312 > localmachine.53949: Flags [S.], seq 1245200353, ack 2408213895, win 28200, options [mss 1410,nop,nop,sackOK,nop,wscale 7], length 0
07:19:32.949553 IP localmachine.53949 > server.30312: Flags [S], seq 2408213894, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
07:19:32.949650 IP server.30312 > localmachine.53949: Flags [S.], seq 1245200353, ack 2408213895, win 28200, options [mss 1410,nop,nop,sackOK,nop,wscale 7], length 0
07:19:34.947783 IP server.30312 > localmachine.53949: Flags [S.], seq 1245200353, ack 2408213895, win 28200, options [mss 1410,nop,nop,sackOK,nop,wscale 7], length 0
07:19:38.947699 IP server.30312 > localmachine.53949: Flags [S.], seq 1245200353, ack 2408213895, win 28200, options [mss 1410,nop,nop,sackOK,nop,wscale 7], length 0
07:19:38.950399 IP localmachine.53949 > server.30312: Flags [S], seq 2408213894, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
07:19:38.950438 IP server.30312 > localmachine.53949: Flags [S.], seq 1245200353, ack 2408213895, win 28200, options [mss 1410,nop,nop,sackOK,nop,wscale 7], length 0
07:19:46.947769 IP server.30312 > localmachine.53949: Flags [S.], seq 1245200353, ack 2408213895, win 28200, options [mss 1410,nop,nop,sackOK,nop,wscale 7], length 0
看起来服务器的 ACK 永远不会到达客户端,客户端不断尝试 SYN,服务器不断尝试响应,直到达到连接超时。这是我的知识的极限,我真的不知道该如何处理这些信息。什么可能导致此类问题,或者我还应该查看什么?