TCP ack暂停,然后恢复,然后再次暂停。 为什么?

注意:这个问题已被移到serverfault.com 。

我想在我的应用程序中寻找降低数据传输速率的原因。

我有12个embedded式系统和一个Linux服务器。 embedded式系统通过交换机通过以太网链路将数据通过TCP发送到服务器。 以下是Wireshark捕获一个板卡上的stream量的TCP StreamGraph。

TCP StreamGraph

正如你所看到的,数据传输发生在大约5.8MBit / s直到大约0.25秒。 这与我所预期的embedded式系统一样快。 在此之后,延期被插入转移。 以下显示了该图的一个特写:

放大StreamGraph

标有ACK的底部的阶梯形曲线显示服务器在任何给定时间已经确认了多less数据。 标有RWIN的相应曲线显示了数据卡上的缓冲区有多less空间。 标记为“发送数据”的较小垂直段是实际发送的数据包。

在A点,服务器以尽可能快的速度发送数据,但是持续23ms,服务器不会发送数据。 允许embedded式系统在不等待ACK的情况下发送RWIN,但是它不这样做,因为它需要保持发送的数据,直到它们被发送(如果需要重新发送),发送缓冲区空间是有限。

然后,在B点,所有接收到的数据立即被确认,正常的确认和发送恢复2.5ms,然后再发生一次暂停。

Wireshark捕获是由一台不同的PC机完成的,该PC连接到交换机上的一个端口,该端口被设置为镜像在embedded式系统所连接的端口上发送和接收的所有数据。

Linux服务器运行一个Java应用程序来处理数据并将它们存储在磁盘上。 它没有显示已经超出了CPU的迹象。 操作系统是具有默认networking设置的Ubuntu Server 12.04。

我可以看到,我可能会从在embedded式系统中分配更多的发送缓冲区空间中获益,以匹配Linux服务器中的接收窗口空间量,但这似乎并不是限制因素。

我的问题是:

  1. 什么可能是Linux服务器暂停ACK的原因,即使它显然能够收到一切就好了?
  2. 我怎么去debugging呢?