我正在使用高端硬件,但是在尝试移动大量数据时,在所有情况下都会遇到 CPU 瓶颈。
具体来说,我在两个 Ubuntu 主机之间移动 2TB 的大型虚拟机映像(VHD)文件。
我最近一次尝试传输 2TB 花了 200 分钟。传输吞吐量约为 170MB/秒。
我正在尝试使用基本 arcfour 密码的 netcat 和 scp 等技术。
两端的硬件是 RAID 10 中的 6 个企业级 SSD,位于硬件 RAID 控制器上。256GB 内存和 Xeon V4 CPU。网络为 20Gbe(2 x 10Gbe LACP)。
在所有情况下,网络和磁盘 i/o 都有足够的容量,瓶颈是将 1 个 CPU 核心持续固定在 100%。
我使用各种方法执行了基本基准测试,如下所示:
30GB 测试文件传输
scp:真实 5m1.970s
nc:实际 2m41.933s
nc & pigz:实际 1m24.139s
但是,因为我 dd 了一个空文件进行测试,所以我认为 pigz 不需要太辛苦。当我尝试在生产 VHD 文件上使用 pigz 时,pigz 的 CPU 负载达到 1200%,我认为这开始成为瓶颈。因此,我的最快时间是由 nc 自己设定的。
nc 在每一端都达到 100% CPU,我假设只是处理从磁盘到网络的 i/o。
我确实考虑过将文件分成块并运行多个 nc 以使用更多核心,但是其他人可能有更好的建议。
答案1
可以尝试以下几件事:
sendfile
使用一个使用(例如 apache)的程序- 调整 Linux 网络堆栈和 NIC
- 启用更大的 MTU
- 启用 NIC 卸载
- 使用性能更好的文件系统(xfs 或 zfs)
这ESnet Fasterdata 知识库是优化快速网络上移动数据的宝贵资源。
答案2
您的端点在物理上是否彼此接近?也许可以考虑使用专为移动大量数据而设计的其他网络介质。CPU 处理可以卸载到适配器卡上,这样您的以太网就不会一次饱和几分钟。
下面是一个(低端)Infiniband 设置,花费约 500 美元,来自 Ebay 配件(Mellanox IS5022 交换机、2 个 CX353A QDR 卡(可能是 FDR,不记得了)和(新)电缆)。我dd
从一个运行着 20 多个虚拟机的虚拟机管理程序中运行,因此其中存在相当多的 I/O 延迟。然而,SSD 传输(iSCSI 安装)仍然值得注意。
至 SATA 阵列 (RAID 10):
# time dd if=/dev/zero of=foo.bin bs=1M count=30000
30000+0 records in
30000+0 records out
31457280000 bytes (31 GB, 29 GiB) copied, 106.652 s, 295 MB/s
real 1m52.795s
user 0m0.022s
sys 0m12.531s
以及 SSD 阵列
# time dd if=/dev/zero of=foo.bin bs=1M count=30000
30000+0 records in
30000+0 records out
31457280000 bytes (31 GB, 29 GiB) copied, 19.1353 s, 1.6 GB/s
real 0m19.137s
user 0m0.020s
sys 0m18.782s
答案3
我发布这篇文章已经有一段时间了,并且获得了一些浏览量,最后我使用了 bbcp:https://github.com/eeertekin/bbcp来饱和网络,它的效果非常好。