在“高延迟networking”上更好的TCP性能

我试图通过Linux机器之间的“高延迟networking”来提高TCP吞吐量。

我将tcp_memtcp_wmemtcp_rmem为“8192 7061504 7061504”。
我将rmem_maxwmem_maxrmem_defaultwmem_default为“7061504”。
我将netdev_max_backlogtxqueuelen设置为10000。
我将tcp_congestion_control设置为“可伸缩”。

我使用“nist”(cnistnet)来模拟100ms的延迟,BW I达到200mbps(没有延迟,达到约790mbps)。

我使用iperf来执行testing和TCPTrace来分析结果,这里是我得到的:

在接收端:
最高胜利:5294720字节
avg win adv:5273959字节
袋发送:0

在发件人方面:
实际数据字节:3085179704
rexmt数据字节:9018144
最大owin:5294577字节
avg owin:3317125字节
RTT最小值:19.2毫秒
RTT最大值:218.2毫秒
RTT avg:98.0 ms

为什么我只能达到200Mbps? 我怀疑“owin”与它有关,但我不确定(这些结果是2分钟的testing,1分钟的testing有1552900的“平均owin”)…

即使延迟为100ms,我预计吞吐量将近790mbps是错误的吗?

(我尝试在窗口configuration中使用更大的数字,但似乎没有效果)

这是一个常见的TCP问题,称为“长pipe”。 如果你使用Google和TCP,你会发现很多关于这个问题和可能的解决scheme的信息。

这个线程有一堆关于调整Linux TCP堆栈的计算和build议。

网站

http://www.psc.edu/networking/projects/tcptune/

提到现在的Linux自动调整TCP设置,搞乱这些值可能不会改善事情。

话虽如此,大概100毫秒和一个大带宽(至less790 mbps)可能会导致一个巨大的BDP,所以也许自动调整决定有什么不对劲,不够远..

尝试设置iperf窗口大小来真正地加速该链接的带宽延迟乘积。 所以平均 RTT * 1Gbps应该大概给你10MB。 看看是否改善了事情。

你真正了解发生的事情的唯一方法就是获得更多的数据 – 否则你只是在猜测或者要求其他人猜测。 我build议使用iostat软件包的sar获取系统级别的视图(cpu,内存,中断等)。 另外,你应该使用Wireshark或tcpdump来获得数据包转储。 你可以使用Wireshark来分析它,因为它有很多的工具。 您可以随时间绘制窗口大小,丢包等。

即使在高延迟链路上丢失一点点数据包,也会对带宽造成相当大的影响。 虽然被模拟 – 这有点奇怪。 很多小包也可能导致高的中断(即使这些中断也可能被模拟?)。

所以简而言之,就是让TCPDump和Sar看看数据包级别和系统资源是怎么回事。