【发布时间】:2021-01-13 14:41:27
【问题描述】:
我正在使用高性能 TCP 服务器,当我使用 TCP 客户端泵送高流量时,我发现服务器的处理速度不够快。经过仔细检查,我看到 TCP 服务器上的“增量时间”出现峰值。而且,我看到服务器发送一个 ACK 并在 0.8 秒后为相同的 seqno 发送 PSH,ACK。我在 pcap 中多次看到这种模式。专家能否评论一下为什么服务器发送一个 ACK 后跟一个 PSH,ACK 之间有延迟?
【问题讨论】:
-
听起来实际问题是
I see the server not processing fast enough on and off when I pump high traffic using a TCP client.虽然我会告诉你添加更多细节,但堆栈溢出侧重于编程问题,所以你应该问这个 expanded 问题服务器故障或 networkengineering.stackexchange.com(如果您是网络专业人士)。 -
在第 95182 帧中,客户端发送 1244 个字节,序列号为 87918542。在第 95183 帧中,服务器 ACKs 87918542+1244=87919786。下一个帧 95184 服务器发送 315 个字节,并且由于除了初始 SYN 之外的每个段都设置了 ACK 标志,它用 87919786 填充 seq,因为它没有从客户端收到任何额外的数据。 PSH 标志提示客户端 TCP 堆栈立即将数据传递给应用程序,这表明 315 字节是服务器对套接字的一次写入。
-
@JimD。感谢您的详细分析。它有助于清除我的一些问题。所以,如果我理解正确的话,帧 95183 和 95184 之间 0.8 秒的“增量时间”表明客户端没有正确地向服务器发送任何数据?在这种情况下,客户端有一个繁忙的循环要写入 SSL 套接字。
-
请注意,第 95182 帧不是完整帧,并且设置了 PSH,因此这很可能是写入套接字的完整有效负载。 95182 中的数据在 95183 中被确认。然后我们在 0.8 秒内看到捕获中没有数据,然后服务器回复 513 个字节。如果客户端正忙于写入套接字,为什么我们在 0.8 秒内看不到更多数据? recvq 中有足够的空间,从捕获中没有明显的原因导致它不会继续发送。
-
@JimD。好点!服务器上的 GC 暂停会导致此问题吗?还是您认为这肯定表明客户端没有向套接字写入任何内容。
标签: networking tcp wireshark pcap tcpdump