Linux

在 Linux 上實現非常快速(300+MB/秒)的文件傳輸

  • July 23, 2021

我正在使用高端硬體,但是在嘗試移動大量數據時,我在所有情況下都會遇到 cpu 瓶頸。

具體來說,我正在兩個 Ubuntu 主機之間移動 2TB 的大型虛擬機映像 (VHD) 文件。

我最近一次嘗試用了 200 分鐘來傳輸 2TB。導致傳輸的吞吐量約為 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 達到了 1200% 的 CPU 負載,我相信這開始成為瓶頸。因此我最快的時間是由 nc 自己設定的。

nc 在每一端都達到 100% CPU,我假設只是處理從磁碟到網路的 i/o。

我確實考慮過將文件分成塊並執行多個 nc 以使用更多核心,但是,其他人可能有更好的建議。

有幾件事要嘗試:

  • 使用使用的程序sendfile(例如 apache)
  • 調整 Linux 網路堆棧和 NIC
  • 啟用更大的 MTU
  • 啟用 NIC 解除安裝
  • 使用性能更好的文件系統(xfs 或 zfs)

ESnet Fasterdata 知識庫是優化跨快速網路移動數據的重要資源。

您的端點物理上是否彼此靠近?也許考慮一種不同的網路介質,它是為移動大量數據而設計的。CPU 處理可以解除安裝到適配卡上,您的乙太網一次不會飽和幾分鐘。

下面是一個(低端)Infiniband 設置,從 Ebay 零件(Mellanox IS5022 開關、2 個 CX353A QDR 卡(可能是 FDR,不記得)和(新)電纜)中花費大約 500 美元。我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

引用自:https://serverfault.com/questions/946857