我有一个非常奇怪的。
当我从两个不同的 Windows 2008 服务器下载文件(并且仅下载)时,会出现数据包丢失,并出现过多的“TCP Dup ACK”和“TCP Fast Retransmission”。上传速度正常。
仅当客户端计算机(Win7)以 100mb/s 的速度连接时才会发生这种情况。在 1GB 时,没有错误,我可以全速运行。如果我将客户端网卡设置为 100Mb/s,我会收到很多“TCP Dup”错误,下载速度会下降到大约 2-5MB/s。上传速度为 10MB/s 或更高。
这只发生在 Windows 2008 Server 机箱上(戴尔,但硬件不同)。如果我在 Win7 客户端和 Linux 服务器之间传输,则不会发生此问题。
这就像 Server 2008 无法正确扩展 TCP 窗口,导致交换机过载或出现其他问题,然后暂停流量一段时间。
由于设备较旧,部分网络运行速度为 100Mb/s,这确实在某些建筑物中造成了问题。
我已从客户端上传了一个 pcap 文件到这里。 https://dl.dropboxusercontent.com/u/24907255/slow.pcap.gz
它显示一个 50MB 的文件被写入服务器,然后从服务器读回并出现错误。
谢谢你的帮助。我被难住了。
11/28/13 更多信息。
我关闭了整个网络,这样网络上就只有一个客户端和一台服务器。问题没有变化。
如果我将每个接口、服务器、客户端和 Cisco 2960 交换机设置为 100Mbs,问题就会消失。如果我将服务器和交换机接口设置为自动或 1Gbs,问题又会出现。
如果我使用 Netgear 10/100 交换机绕过交换机并将客户端和服务器都设置为自动,则不会遇到任何问题。
我确实发现了这一点。在正常设置下,服务器到交换机的速度为 1Gbs,我在客户端和 Cisco 交换机之间插入 Netgear 10/100 交换机,我的速度问题更加严重。速度从 5-7MB/s 下降到 2-3MB/s,是的,我尝试过固定和自动网络速度。这可以解释为什么一些建筑物与主 Cisco 交换机之间有 2 个交换机跳跃,速度问题更严重。
开始 ping。当所有东西都以 1GB/s 的速度运行时,我可以 ping 完整的 TCP 负载,ping -l 65500 就可以了。当客户端速度为 100Mbs 时,我可以 ping 的最大大小是 17752。再多一点就会失败,只能ping到 Windows 服务器,Linux 机器上没有问题。当服务器和客户端之间有 Netgear 10/100 时,ping 65500 没有问题。
更新 3
我换了一个 PowerConnect 2748 交换机。服务器速度为 1Gbs,客户端速度为 100Mbs,问题依然存在。不过我现在可以 ping 通 17752。很奇怪。所以我不认为这是 Cisco 交换机的问题。
更新 4。我正尝试使用 ipref 获取一些硬数字。所有系统都连接到同一个交换机,客户端设置为 100Mbs 并运行命令 ipref.exe -c -u -b 10m。因此发送到服务器。一台服务器是 2008,目前没有负载,另一台是 Ubuntu,平均负载为 .20。
10米处
- Linux抖动0.022ms,丢包率为0/8505
- 服务器2008抖动1.859,数据包丢失68/8505
将其推至100米
- Linux 抖动 0.445,数据包丢失 0/26634
- 服务器 2008 抖动 0.542,数据包丢失 94/26596
现在向 10 米外的客户端发送统计数据
- Linux 抖动 0.271 毫秒,0/8500 (0%) 1 个数据报无序接收
- 服务器 2008 抖动 .063, 20/8505 (0.24%)
将其推至100米
- Linux 抖动 0.230 ms 4083/85443 (4.8%),1 个数据报无序接收,95.7Mbs
- 服务器 2008 抖动 0.237, 28174/81718 (47%), 51.1mbs
因此,Server 2008 总体而言表现较差,但是当连接被推到客户端 100mbs 限制时,您会看到 47% 的巨大数据包丢失。
更新 5。
当我使用 PowerConnect 2748 交换机进行测试时,我在服务器和交换机以及客户端和交换机之间使用了不同的 cat5 电缆。这应该可以排除布线或交换机问题。
在这个环境中,我有两个 Windows 2008 Server,安装时间不同,硬件也不同。它们唯一的共同点是 Broadcom 品牌的网卡,但芯片组不同。两者都遇到了同样的问题,但我主要测试的是其中一个,所以如果出现问题,另一个仍然可以工作。
一台服务器内置了 BCM5709C,带有两个端口,还有一张附加卡,我认为是 pci express,卡也带有相同的 BCM5709C 芯片组和两个端口。我试过了所有这些,问题仍然存在。所以这应该可以排除任何硬件问题。
更新 6 12/3/13 我安装了 Intel 网卡。没有变化。我尝试了 ctcp 设置,但没有任何变化。我甚至关闭了 SMB2,也没有任何变化。
我以 100Mbs 的速度做了更多测试:将 3GB ISO 映像复制到服务器,进行拖放,平均速度为 10MB/s。从服务器复制相同的 3GB ISO 映像,平均速度为 6.3MB/s。
所有网络接口均设置为自动和 1Gbs。将 ISO 复制到服务器,平均速度为 101MB/s 从服务器复制 ISO,平均速度为 57MB/s
因此服务器的读取速度几乎是写入速度的一半。
答案1
这听起来像是速度/双工不匹配导致冲突和重传。服务器和另一端之间的配置错误可能导致这种情况。不匹配的另一个原因可能是自动协商失败。
确保连接两端的速度和双工配置相同。
答案2
我认为您应该调查 NIC 驱动程序/Windows NDIS 卸载设置是否与您的问题有关。我最怀疑的是 LSO(大型发送卸载)功能,因为我看到它完全破坏了一项服务(带有 Broadcom NIC 的戴尔服务器),其破坏方式违背了所有故障排除书籍对任何事物的定义。
LSO 的实际效果是,当它破坏而不是增强时,LSO 引擎可能会传递交换机支持的更大数据帧。这会导致交换机默默丢弃这些帧。不用说,这会导致性能下降和数据包丢失。故障可能迫在眉睫,但也可能间歇性发生,使得故障排除变得极其困难。下面详细介绍了这一点:大量发送卸载和网络性能
免责声明:这只是针对您的问题的可能角度做出的尽力而为的想法。实施以下任何一项更改都将中断您的网络通信。应用任何设置后,应重新启动计算机。我复制/粘贴了最有趣的设置以供参考,但链接包含所有核心信息和注意事项。我强烈建议使用官方文档作为更改的基础,这篇文章最多像一份清单。
在继续任何操作之前,请备份您的注册表项:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
一个不太酷的原因是由于下面描述的一个官方错误,当通过命令行发送某些设置时,它会改变一些不相关的值。
我坦率地承认,在 Windows NIC 驱动程序 GUI 和 Windows 中都存在设置的情况下,我从未真正弄清楚是否必须在 GUI 和 Windows CMD/注册表中禁用它们,或者是否只需禁用一个就足够了。我读过的博客提供了答案,但在某些细节方面不一致,所以我一直不确定。现在,我尝试更改我所关注的任何设置的选项。这里没有介绍 GUI 选项,但在官方文档中有描述。
此外,同一卡的不同 NIC 驱动程序在 GUI 中的高级设置中可能会呈现不同的粒度。
禁用任务卸载
此注册表设置禁用任务卸载,定义在使用注册表值启用和禁用连接卸载。
HKLM\System\CurrentControlSet\Services\TCPIP\Parameters\DisableTaskOffload
Setting this value to one disables all of the task offloads from the TCP/IP
transport. Setting this value to zero enables all of the task offloads.
如果上述设置有任何效果,您可以尝试按照链接中指定的方式进行细化。有相当多的设置可以控制这一点,所以我不会将它们全部粘贴进去。
不过,我会提供 LSO 的:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\LsoV1IPv4
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\LsoV2IPv4
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\LsoV2IPv6
For all three: Enabled = 1(default). Disabled = 0.
禁用连接卸载
根据定义使用注册表值启用和禁用连接卸载。
HKLM\System\CurrentControlSet\Services\TCPIP\Parameters\TCPConnectionOffloadIPv4
Describes whether the device enabled or disabled the offload of TCP connections
over IPv4. Enabled = 1 (Default). Disabled = 0.
HKLM\System\CurrentControlSet\Services\TCPIP\Parameters\TCPConnectionOffloadIPv6
Describes whether the device enabled or disabled the offload of TCP connections
over IPv6. Enabled = 1 (Default). Disabled = 0.
禁用 TCP Chimney、TOE 和 TSO
如如何禁用 TCP 烟囱、TCPIP 卸载引擎 (TOE) 或 TCP 分段卸载 (TSO) 注意Win2008修补程序
以及有关 Windows Server 2008 中的 TCP 烟囱卸载、接收方缩放和网络直接内存访问功能的信息。
Windows 2008 Server:
If the operating system is Microsoft Windows Server 2008 (any version
including R2), run the following from a Command prompt:
1. netsh int tcp set global chimney=disabled
2. netsh int tcp set global rss=disabled
3. netsh int tcp set global netdma=disabled
Note: To display current global TCP settings, use the net shell command:
netsh int tcp show global
4. Restart the server.
Note: Microsoft has identified an issue running the netsh command to set global
TCP parameters on Windows Server 2008 and Vista machines. Some global
parameters, such as TCPTimedWaitDelay, can be changed from their default or
manually set values to 0xffffffff. Before running the above command, Symantec
recommends reviewing Microsoft KB Article 967224 (support.microsoft.com/kb/967224).
Upon completion of the above command's execution, Symantec also recommends
reviewing the TCP Parameters noted in the KB Article and applying the hotfix from
the article if needed.
` 该修补程序对此问题的描述如下:
After you run the command, the values of the following unrelated settings are
changed to 0xFFFFFFFF:
KeepAliveInterval
KeepAliveTime
TcpTimedWaitDelay
In addition, the "TcpMaxDataRetransmissions" are changed to 0xFF.
再次,人们可能希望在执行任何操作之前备份整个注册表项:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
如果您在 Google 上搜索您的问题以及上面的卸载要点,您会发现无数帖子、文章和博客描述由于 NIC 卸载而导致的类似问题。但如果它仍然不起作用,那么我想您可以继续尝试其他方法,因为这不是由于电缆、NIC 或交换机端口半断引起的,对吗?
答案3
总是查看网络设备以寻找线索.....因此,如果是思科,请执行“显示接口 f0/11”或任何可能的情况。重新传输也可能是由于以太网端口/网卡/电缆损坏,例如由于“串扰”.....如果是这种情况,交换机上的 show int 应该会向您显示这些错误统计数据,而且显然会太高
编辑:因为这是微软,所以很可能是你的问题,但除此之外,一般来说,从第一层开始(确保物理电缆良好),然后沿着堆栈向上工作,...即第 2 层,速度/双工/mac 地址过滤,..然后是第 3 层 ip/udp/tcp 防火墙,...等等
答案4
您是否检查过 100/1000 网络上的巨型帧是否关闭?
更新型多巴胺:
如果使用巨型帧,那么广播域上的所有网络硬件都应该使用它。对于传统的 100mb 设备来说,这是不可能的。
我不知道 win2008 tcp 究竟是如何工作的,但提供 jombo 帧后,它可能会开始根据数据包大小(而不是像往常一样根据数据包数量)缩放传输窗口。然后您将观察到如所描述的情况。
供参考:http://m.windowsitpro.com/windows/q-how-do-i-enable-jumbo-frames
UPD2:
我查看了您提供的数据包转储,发现很多数据包的长度 > 1500,校验和不正确(长度 < 1500 的校验和正常)。这证实了我的假设。
我唯一无法理解的是——它们与第一个会话相关:从客户端到服务器(!!!???):
22:25:06.041113 IP (tos 0x0, ttl 128, id 31391, offset 0, flags [DF], proto TCP (6), length 40) 192.168.0.109.49225 > 192.168.0.252.microsoft-ds: Flags [.], cksum 0x9422 (correct), ack 1453, win 1234, length 0
22:25:06.041223 IP (tos 0x0, ttl 128, id 31392, offset 0, flags [DF], proto TCP (6), length 64280, bad cksum 0 (->285)!) 192.168.0.109.49225 > 192.168.0.252.microsoft-ds: Flags [.], cksum 0x82c0 (incorrect -> 0xc9bb), seq 718652:782892, ack 1453, win 1234, length 64240SMB-over-TCP packet:(raw data or continuation?
22:25:06.041254 IP (tos 0x0, ttl 128, id 31437, offset 0, flags [DF], proto TCP (6), length 1452) 192.168.0.109.49225 > 192.168.0.252.microsoft-ds: Flags [P.], cksum 0x0517 (correct), seq 782892:784304, ack 1453, win 1234, length 1412SMB-over-TCP packet:(raw data or continuation?)
22:25:06.041278 IP (tos 0x0, ttl 128, id 31438, offset 0, flags [DF], proto TCP (6), length 2960, bad cksum 0 (->f1df)!) 192.168.0.109.49225 > 192.168.0.252.microsoft-ds: Flags [.], cksum 0x82c0 (incorrect -> 0xfa12), seq 784304:787224, ack 1453, win 1234, length 2920SMB-over-TCP packet:(raw data or continuation?)
22:25:06.042134 IP (tos 0x0, ttl 128, id 31441, offset 0, flags [DF], proto TCP (6), length 2960, bad cksum 0 (->f1dc)!) 192.168.0.109.49225 > 192.168.0.252.microsoft-ds: Flags [.], cksum 0x82c0 (incorrect -> 0x1d7e), seq 787224:790144, ack 1453, win 1234, length 2920SMB-over-TCP packet:(raw data or continuation?)
22:25:06.042492 IP (tos 0x0, ttl 128, id 31444, offset 0, flags [DF], proto TCP (6), length 5880, bad cksum 0 (->e671)!) 192.168.0.109.49225 > 192.168.0.252.microsoft-ds: Flags [.], cksum 0x82c0 (incorrect -> 0xa74e), seq 790144:795984, ack 1453, win 1234, length 5840SMB-over-TCP packet:(raw data or continuation?)