我被授予了访问 Windows Server 2003 SP1 系统 (10.a.bbb.ccc) 上的共享的权限,该系统是文件和打印机服务器,并且经常将大型文件复制到该共享。但是,这种复制偶尔会失败。当使用 Robocopy (在 10.xxx.yy.zzz 上) 重现此问题时,我得到了类似
70.4%
2013/07/31 11:20:21 ERROR 64 (0x00000040) Copying File <<file name removed>>
The specified network name is no longer available.
Waiting 30 seconds... Retrying...
New File 105.2 m <<file name removed>>
0.0%
dumpcap
+ Wireshark 显示,当发生这种情况时,在复制过程中,服务器突然不再接受 TCP 端口 445 上的任何数据,方法是将窗口大小设置为零:
No. Time Source Destination Protocol Length Info
7303 5.841186000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7304 6.149715000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 55 [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
7305 6.150137000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7306 6.749711000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 55 [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
7307 6.750087000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7308 7.946779000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 55 [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
7309 7.947130000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7310 10.349783000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 55 [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
7311 10.350201000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7312 15.149910000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 55 [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
7313 15.150283000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7314 24.747096000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 55 [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
7315 24.756210000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7316 43.958531000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 55 [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
7317 43.958863000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 60 [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
7318 75.216401000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 54 57918 > microsoft-ds [RST, ACK] Seq=6973070 Ack=10864 Win=0 Len=0
7319 75.225543000 10.xxx.yy.zzz 10.a.bbb.ccc TCP 66 55972 > microsoft-ds [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
7320 75.225933000 10.a.bbb.ccc 10.xxx.yy.zzz TCP 66 microsoft-ds > 55972 [SYN, ACK] Seq=0 Ack=1 Win=16384 Len=0 MSS=1460 WS=1 SACK_PERM=1
因此 70 秒后客户端(这里是:Robocopy)就会退出。
我的问题:这是 Windows 共享的已知问题吗?在文件服务器上可以调查/调试/跟踪什么?我们需要查看或试验哪些特定设置?
提前致谢!
答案1
我同意@suprjami的观点,并愿意提供这种可能的探索途径:而不是服务器的磁盘被太慢了,请考虑它们可能出现故障(通常硬盘驱动器每读取一次坏簇就会冻结约 8 秒)、严重碎片化、空间不足(导致严重碎片化和严重的磁盘抖动),或者您的计算机上可能存在严重 CPU 限制或磁盘限制的任务,导致其他所有任务(包括网络和磁盘子系统)都处于空闲状态。我建议检查服务器的事件查看器中是否存在磁盘错误,并调出任务管理器或进程资源管理器,其中有一些列显示页面错误、CPU 使用率以及 I/O 读取字节数和写入字节数,并查看这些数字的作用。
鉴于 ZeroWindow 是 TCP 接收缓冲区已满的症状,我愿意相信问题在于要么是服务器上的某些东西消耗了 100% 的 CPU,要么是某些东西导致过多的网络流量进入服务器并锁定了所有内容。
另一种可能性是中间设备的 TCP 实现中存在缓冲区膨胀,如果该设备以任何方式(即 NAT)修改其中继的数据包。您的传输速率是否会偶然出现高峰和下降?
答案2
在查看 TCP 调整参数之前(您可以在 Windows 上调整 TCP 堆栈,但 99.9% 的时间里,它的自动缩放功能运行良好),您能否提供更多背景信息?例如:接收服务器的规格是什么,客户端和服务器是否都在同一个第 2 层网络上,NIC 的运行速度是多少,等等。
此外,是否值得尝试 ROBOCOPY 的 /IPG 参数,或许还有 /R: 和 /W: (重试并等待)参数?
答案3
TCP 零窗口意味着接收主机不堪重负。它告诉发送主机停止发送数据,因为它需要一些时间来处理已经收到的数据。
这听起来就像是服务器中的磁盘太慢,客户端最终放弃并导致连接超时。
在离开客户端时减慢传输速度,或者在服务器中放置更快的磁盘。