為什麼 scp 壓縮比沒有壓縮慢?
我需要將一個 20 GB KVM vdisk 文件(儲存 CentOS 6.5 VM 的根文件系統)從一台實驗室伺服器傳輸到另一台。大文件大小以及我曾經將這樣的 vdisk 文件壓縮到幾百兆字節的事實使我本能地啟用了壓縮,
scp
但我驚訝地發現傳輸速度相當低。然後我嘗試與andbzip2
結合併被嚇了一跳。這是方法和平均吞吐量的摘要。ssh``cat
scp -C vm1-root.img root@192.168.161.62:/mnt/vdisks/
, 11 MB / 秒。bzip2 -c vm1-root.img | ssh -l root 192.168.161.62 "bzip2 -d -c > /mnt/vdisks/vm1-root.img"
, 5 MB/秒。這個更低的結果促使人們在網上搜尋。scp -c arcfour -C vm1-root.img root@192.168.161.62:/mnt/vdisks/
, 13 MB/秒。在關於 serverfault的一個答案-c arcfour
中建議使用as。它幾乎沒有幫助。最後,我禁用了壓縮。scp vm1-root.img root@192.168.161.62:/mnt/vdisks/
, 23 MB/秒。壓縮不應該更快嗎?
在收到
ssh(1)
來自@sven 的手冊頁提示後,我嘗試了幾種不涉及壓縮的文件傳輸替代方法,兩者都取得了更好的結果。
cat vm1-root.img | ssh -l root 192.168.161.62 "cat > /mnt/vdisks/vm1-root.img"
, 26 MB/秒。nc -l 5678 > /mnt/vdisks/vm1-root.img
在接收器和nc 192.168.161.62 5678 < vm1-root.img
發射器上,40 MB/s。該埠5678
是可用的任意埠。使用
nc
原來是最快的複制方法!過去,
scp -C
每當我認為它會時,它都工作得很好。例如,傳輸/var/log/messages*
幾 GB 大小的 syslog ( ) 時。幾百 KB/s 的未壓縮傳輸速率將增加到 1-2 MB/s。如手冊頁中所指出的,此範例確實適用於連接緩慢的情況。我有一個案例,為 20 GB 分區新創建的虛擬磁碟映像的壓縮大小僅為 200 MB。以大約 25 MB/s 的傳輸速率,我們可以在 8 秒內完成複制,而不是超過 13 分鐘!顯然,
scp
在這種情況下,沒有壓縮是低效的,scp -C
甚至更糟。我想,這裡學到的主要教訓是,
scp -C
應該被認為只是一種方便。如果一個文件可以顯著壓縮,那麼最好先在源上壓縮它,然後傳輸壓縮形式,最後在目標上解壓縮。快速進行壓縮和解壓縮的工具(例如pbzip2)將有更大的幫助。
引用
man ssh
(這是 所使用的基礎scp
):壓縮在調製解調器線路和其他慢速連接上是可取的,但只會減慢快速網路上的速度。
問題是壓縮數據比通過網路發送數據需要更多時間。
此外,除了壓縮之外,nc 獲得最佳速率,因為它也不加密。無損壓縮依賴於查找數據的冗餘部分,當在網路級別完成時,您最多可以查看
$$ buffer-size $$字節,當首先處理整個文件時,它是$$ file-size $$尋找和處理重複的字節句子的字節。 此外,對於移動磁碟映像,您應該使用文件系統感知工具,例如 ntfsclone/partclone,因為即使是壓縮也無法簡單地跳過未分配的塊 - 如果您不必傳輸任何數據,您的傳輸速率是無限的。也不要忘記銷毀 Windows 分區上的交換和休眠文件,否則你正在複製垃圾文件,它只會扔掉並重新創建。