场景:我们有许多Windows客户端定期将大文件(FTP / SVN / HTTP PUT / SCP)上传到距离服务器100-160毫秒的Linux服务器。我们办公室的同步带宽为1Gbit / s,服务器是AWS实例或物理托管在美国DC中。
最初的报告是,上传到新服务器实例的速度要慢得多。这在测试中和从多个位置产生出来;客户端从Windows系统向主机看到稳定的2-5Mbit / s。
我iperf -s
在一个AWS实例上爆发,然后从办公室的Windows客户端爆发:
iperf -c 1.2.3.4
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55185
[ 5] 0.0-10.0 sec 6.55 MBytes 5.48 Mbits/sec
iperf -w1M -c 1.2.3.4
[ 4] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55239
[ 4] 0.0-18.3 sec 196 MBytes 89.6 Mbits/sec
后面的数字在后续测试中可能会发生很大变化(AWS的变化),但通常在70到130Mbit / s之间,足以满足我们的需求。窃听会话,我可以看到:
iperf -c
Windows SYN-Window 64kb,Scale 1-Linux SYN,ACK:Window 14kb,Scale:9(* 512)iperf -c -w1M
Windows SYN-Windows 64kb,Scale 1-Linux SYN,ACK:Window 14kb,Scale:9
显然,链接可以维持这种高吞吐量,但是我必须明确设置窗口大小以使用它,大多数现实世界的应用程序都不允许我这样做。在每种情况下,TCP握手使用相同的起点,但是强制缩放
相反,从同一网络上的Linux客户端,直接iperf -c
使用系统默认值85kb可以得到:
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 33263
[ 5] 0.0-10.8 sec 142 MBytes 110 Mbits/sec
在没有任何强制的情况下,它可以按预期扩展。这不可能是中间的跃点或本地交换机/路由器中的东西,并且似乎会影响Windows 7和8客户端。我已经阅读了许多有关自动调整的指南,但是这些指南通常是关于完全禁用扩展以解决糟糕的家庭网络套件问题。
谁能告诉我这里发生了什么,并给我一种解决方法?(最好是可以通过GPO坚持注册的内容。)
笔记
有问题的AWS Linux实例在以下方面应用了以下内核设置sysctl.conf
:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216
我已经在服务器端使用dd if=/dev/zero | nc
重定向/dev/null
到来排除iperf
并消除任何其他可能的瓶颈,但是结果却几乎相同。使用ncftp
(Cygwin,Native Windows,Linux)进行测试的规模与上述在各自平台上进行的iperf测试大致相同。
编辑
我在这里发现了可能与之相关的另一件事:
这是1MB捕获的第一秒钟,放大了。随着窗口的扩大和缓冲区变大,您可以看到Slow Start的动作。有那么〜0.2s的这个小平台正是在默认窗口iperf的测试拉平永远的地步。这当然可以缩放到很多眩晕的高度,但是很好奇在缩放之前会有这种暂停(值是1022bytes * 512 = 523264)。
更新-6月30日。
跟进各种回应:
- 启用CTCP-这没有区别;窗口缩放是相同的。(如果我理解正确,此设置将增加拥塞窗口的放大率,而不是它可以达到的最大大小)
- 启用TCP时间戳。-这里也没有变化。
- Nagle的算法-很有道理,至少这意味着我可以忽略图中的特定斑点作为问题的任何迹象。
- pcap文件:可在此处找到的Zip文件:https : //www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip每个OS客户端一个供比较)
更新2-6月30日
哦,所以按照关于Kyle建议的操作,我启用了ctcp并禁用了烟囱卸载:TCP全局参数
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : ctcp
ECN Capability : disabled
RFC 1323 Timestamps : enabled
Initial RTO : 3000
Non Sack Rtt Resiliency : disabled
但是可悲的是,吞吐量没有变化。
我在这里确实有一个因果问题:图形是在服务器到客户端的ACK中设置的RWIN值。对于Windows客户端,我是否认为Linux不会将这个值扩展到这个最低点以上,因为客户端有限的CWIN甚至无法填充该缓冲区吗?Linux是否会人为限制RWIN的其他原因?
注意:我已经尝试过为它打开ECN。但是没有变化。
更新3-6月31日。
禁用启发式和RWIN自动调整后没有任何变化。已使用通过设备管理器选项卡公开功能调整的软件,已将英特尔网络驱动程序更新至最新版本(12.10.28.0)。该卡是82579V芯片组板载NIC-(我将从Realtek或其他供应商的客户那里进行更多测试)
专注于NIC片刻,我尝试了以下操作(大多数情况下只是排除了不太可能的罪魁祸首):
- 将接收缓冲区从256增加到2k,将发送缓冲区从512增加到2k(现在都最大)-不变
- 禁用所有IP / TCP / UDP校验和卸载。- 没变。
- 禁用大型发送卸载-Nada。
- 关闭IPv6,QoS调度-Nowt。
更新3-7月3日
为了消除Linux服务器端,我启动了Server 2012R2实例,并使用iperf
(cygwin二进制)和NTttcp重复了测试。
有了iperf
,我必须明确指定-w1m
在两个双方之前的连接将扩展到超过〜5Mbit / s的。(顺便说一句,我可以检查一下,在91ms延迟下〜5Mbits的BDP几乎恰好是64kb。找出限制...)
ntttcp二进制文件现在显示了这种限制。通过ntttcpr -m 1,0,1.2.3.5
在服务器和ntttcp -s -m 1,0,1.2.3.5 -t 10
客户端上使用,我可以看到更好的吞吐量:
Copyright Version 5.28
Network activity progressing...
Thread Time(s) Throughput(KB/s) Avg B / Compl
====== ======= ================ =============
0 9.990 8155.355 65536.000
##### Totals: #####
Bytes(MEG) realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
79.562500 10.001 1442.556 7.955
Throughput(Buffers/s) Cycles/Byte Buffers
===================== =========== =============
127.287 308.256 1273.000
DPCs(count/s) Pkts(num/DPC) Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
1868.713 0.785 9336.366 0.157
Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
57833 14664 0 0 9.476
8MB / s达到了我在中显式使用大窗口所获得的水平iperf
。不过,奇怪的是,在1273个缓冲区中有80MB =再次是64kB缓冲区。进一步的Wireshark显示了一个很好的,可变的RWIN从服务器返回(客户端似乎已实现)(比例因子256);因此,ntttcp可能会误报发送窗口。
更新4-7月3日
在@karyhead的要求下,我进行了一些测试,并生成了一些更多的捕获信息,请访问:https ://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
iperf
从Windows到与以前的相同(1.2.3.4)相同的Linux服务器,还有另外两个s:一个具有128k套接字大小和默认的64k窗口(再次限制为〜5Mbit / s),另一个具有1MB的发送窗口和默认的8kb套接字尺寸。(比例更高)ntttcp
从同一Windows客户端到Server 2012R2 EC2实例(1.2.3.5)的一条跟踪。在这里,吞吐量可以很好地扩展。注意:NTttcp在打开测试连接之前会对端口6001做一些奇怪的事情。不知道那里发生了什么。- 一个FTP数据跟踪,
/dev/urandom
使用Cygwin 将20MB的数据上传到几乎相同的linux主机(1.2.3.6)ncftp
。再次有极限。使用Windows Filezilla时,模式几乎相同。
更改iperf
缓冲区长度确实会与时序图(更多的垂直部分)产生预期的差异,但实际吞吐量没有变化。
netsh int tcp set global timestamps=enabled