好吧,故事的内容比标题所暗示的还要多一些。
背景与环境:我正在通过 SMB 将几 TB 的数据从较旧的 Ubuntu 服务器复制到较新的 Windows 2012 服务器。(从技术上讲,它是商品硬件,但它们是这里的服务器。)每个人都在千兆 LAN 上,较旧的 Ubuntu 盒子有一个绑定接口。我相信 Ubuntu 服务器有两个 Rosewill PCI-e 1x 以太网卡,而 Windows 服务器有一个相当不错的 PCI Intel 以太网卡。
目标计算机(Windows 服务器)正在运行一个存储池,该存储池包含 4 个 2TB 驱动器,具有奇偶校验功能。它正在运行 Microsoft 的新 ReFS。源计算机(Ubuntu 服务器)正在运行软件 RAID 镜像。它正在运行老旧的 EXT4。
两台服务器通过单个千兆交换机运行。我尝试过断开源 (Ubuntu) 计算机上的绑定,但没有任何改善。
问题:我可以轻松地以合理的速度从其他计算机传输到 Windows 服务器。其他计算机可以轻松承受 50-80MB/s 的速度,但从该 Ubuntu 服务器传输的速度最高不超过 20MB/s。以 20MB/s 的速度传输 4+TB 需要很长时间(大约 2.3 天),我想知道我可以做些什么来找出瓶颈在哪里。
症状:两台电脑的 CPU 占用都很低,当然也不会太高。两台电脑的硬盘都很活跃,但也没有被淹没,至少在 Ubuntu 服务器上,CPU IOwait 几乎为 0%。
我进行了 35 秒的 Wireshark 跟踪(大概足够长以确保所有 ACK 都是针对新数据包的),并注意到有很多事情我没想到。(1)从 Windows 到 Ubuntu 的 ACK(和某些 SMB 数据包)没有任何校验和。但是,Wireshark 声称这可能是由于“IP 校验和卸载”。好的,我的卡很不错。我想网卡可以进行校验和计算。很好。继续……(2)“TCP 确认了未见段”。这个我有问题。据我所知,ACK 编号在可接受的范围内,并且这些消息通常有大量块。也许 Wireshark 太慢了?
概括:传输速度很差(千兆以太网上为 20MB/s),我不知道为什么。Wireshark 声称 Windows 正在确认 Ubuntu 从未发送过的内容。
猜测:我的第一个猜测是较便宜的 Rosewill 卡已经不堪重负。我的第二个猜测是,一端或另一端的软件 RAID 类设备已经忙得不可开交。
答案1
当 Samba(不确定这是否仍然是默认设置;很长时间以来都是如此)配置为默认读写套接字缓冲区大小为 1024 字节时,您的性能差距与常见体验相符。
我以前在 Linux 和 Mac 机器上经常看到这种情况。希望现在不会再出现这种情况。
samba 的配置文件中有一个套接字选项参数,您可以在其中设置读写套接字缓冲区大小。建议您将两者都设置为 8192 字节 (8 KiB)。4 或 8 KB 通常差不多,但我还没有在千兆链路上测试过。
此外,不要指望单个 TCP 连接能从绑定链路中获益,流量几乎总是会通过其中一个链路;否则,您最终会面临大量无序数据包需要处理;因此,只有在为多个客户端提供服务时,才需要期待负载平衡的好处。即便如此,您也应该查找不同的绑定模式,并知道至少对于“模式 4”(IEEE 802.3ad)绑定,基本上有两种传输哈希模式,它们决定了在哪个从属接口上发送。有第 2 层哈希(默认)和第 3 层哈希。如果通过网关发送大量数据,第 2 层哈希将不会很好地分布,因为网关的 MAC 地址将相同。请考虑改用第 3 层。
答案2
我曾经在一台 Ubuntu 电脑上安装了两张以太网卡,但不知为何,它无法正常工作——它们似乎都在争夺相同的数据包,所以有时候我会收到回复,有时候则不会,这取决于另一张网卡是否抢占了数据包。这很奇怪。我肯定是配置错误了,但我本以为它会正常工作。当然,这些卡有唯一的 IP 地址。
无论如何,您只需要在连接到网络的机器上安装一张以太网卡即可轻松尝试排除这种情况。