在 Linux 上实现非常快(300+MB/秒)的文件传输

在 Linux 上实现非常快(300+MB/秒)的文件传输

我正在使用高端硬件,但是在尝试移动大量数据时,在所有情况下都会遇到 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来饱和网络,它的效果非常好。

相关内容