我想帮助找到我的应用程序中降低数据传输速率的原因.
我有12个嵌入式系统和一个Linux服务器.嵌入式系统通过交换机在以太网链路上通过TCP向服务器发送数据.以下是通过Wireshark捕获来自一块板的流量的TCP StreamGraph.
如您所见,数据传输速率约为5.8MBit / s,最高可达0.25秒.这跟我所期望的嵌入式系统一样快.在此之后,在传输中插入延迟.以下显示了图表的特写:
标记为ACK的底部的阶梯形状曲线显示服务器在任何给定时间已经确认了多少数据.标记为RWIN的相应曲线显示数据带上的缓冲区中有多少空间.标记为SENT DATA的较小垂直段是发送的实际包.
在A点,服务器以尽可能快的速度确认数据,但是在23ms的持续时间内,服务器不会发送任何消息.允许嵌入式系统在不等待ACK的情况下发送到RWIN,但它不会这样做,因为它需要保持发送的数据,直到它们被激活(如果它们需要被重新发送)并且发送缓冲区空间是有限.
然后,在B点,所有接收的数据立即被确认,正常的acking和发送在另一个暂停发生之前恢复2.5ms.
Wireshark捕获是由另一台PC完成的,该PC连接到交换机上的一个端口,该端口设置为镜像嵌入式系统所连接的端口上发送和接收的所有数据.
Linux服务器运行Java应用程序,该应用程序处理数据并将其存储在磁盘上.它没有显示出最大化cpu的迹象.操作系统是Ubuntu Server 12.04,具有默认网络设置.
我可以看到,我可能会从嵌入式系统中分配更多的发送缓冲区空间中获益,以匹配Linux服务器中的接收窗口空间量,但这似乎不是限制因素.
我的问题是:
>什么可能是Linux服务器暂停ACK的原因,即使它显然能够收到一切就好了?
>我该如何调试?
解决方法
尝试使用ethtool -A devname autoneg off rx off tx off关闭以太网PAUSE帧 如果这没有帮助,它可能是TCP窗口缩放问题和/或发送或接收器主机上的IRQ存储问题.您可以使用调节TCP流量的ethtool和sysctl条目来调查尝试不同设置的两个问题. 没有其他信息,很难说出这里发生了什么……