在 Linux 上實現非常快速(300+MB/秒)的文件傳輸
我正在使用高端硬體,但是在嘗試移動大量數據時,我在所有情況下都會遇到 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