Ssh

為什麼 scp 壓縮比沒有壓縮慢?

  • October 26, 2021

我需要將一個 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 分區上的交換和休眠文件,否則你正在複製垃圾文件,它只會扔掉並重新創建。

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