前面一篇介紹了如何最大限度的榨取SCP的傳輸速度,有了這個基礎,就可以進一步的使用壓縮來加速傳輸速度了。只使用scp,傳輸速率最快約90MB,本文通過壓縮將把最快傳輸速率提升到約250MB/s(包括解壓的過程)。
目錄
- 1. 結論
- 2. 關於lz4
- 3. 效能環境說明
- 3.1 磁碟讀取和落盤
- 3.2 打包、拆包
- 3.3 壓縮、解壓縮
- 3.4 傳輸
- 3.5 整體流程
- 4. 實驗測試
- 5. lz4參數測試
- 5. 為什麼不用nc
- 6. 還能不能更快
- 附錄
- 參考閱讀
1. 結論
使用tar+lz4+ssh的方式能夠獲得最大的傳輸效能:
time tar -c sendlog/|pv|lz4 -B4|ssh -c arcfour128 \ -o"MACs umac-64@openssh.com" 10.xxx.xxx.36 "lz4 -d |tar -xC /u01/backup_supu" 3.91GiB 0:00:16 [ 249MiB/s] real 0m16.067s user 0m15.553s sys 0m16.821s
249MB/s,妥妥的。是最原始scp(40MB/s)的6倍,原來400GB傳輸需要約3小時,現在只需要27分鐘了。
注1:lz4在解壓方面的優異表現,使得他在本案例中非常重要。如果無需解壓的傳輸,則可以考慮使用pigz/pbiz2
注2:使用pv觀察,網路流量約80MB,所以使用nc替換ssh並不會有明顯的效能提升
注3:lz4壓縮使用-B4(64KB塊大小),解壓使用-B7(4MB塊大小),是本案例的測試最優值
2. 關於lz4
lz4是一個讓"人見人愛、花見花開"的壓縮演算法,能夠在多核上很好的擴充,壓縮速度和壓縮比並沒有太大優勢(pigz),但是他的解壓速度非常驚人,本案例測試lz4的解壓是gunzip的3倍(更多的對比測試)。因為壓縮時高效的多核利用,再加上驚豔的解壓,lz4已經在非常多重要場合使用了:Linux3.11核心實現了LZ4,並可以使用其壓縮和解壓kernel image HBase:Add an LZ4 compression option to HFile等等(參考)。
對於需要頻繁壓縮、即時快速解壓的情境來說,lz4非常適合。
3. 效能環境說明
這裡使用同上一篇文章相同的兩台主機環境:ping獲得RTT是17ms;使用iperf測試頻寬是115MB(參考附錄);
整個過程有幾個階段:磁碟讀取-->打包(tar)-->壓縮-->傳輸-->解壓縮-->拆包-->落盤 對應了的速度測試:
3.1 磁碟讀取和落盤
磁碟讀取(有page cache),能到3GB/s;磁碟寫入約428MB:
# dd if=./sendlog.tar of=/dev/null bs=4096 count=1048576 1024002+1 records in 1024002+1 records out 4194314240 bytes (4.2 GB) copied, 1.33946 s, 3.1 GB/s # dd if=/dev/zero of=./x.zero.file bs=4096 count=1048576 1048576+0 records in 1048576+0 records out 4294967296 bytes (4.3 GB) copied, 10.0306 s, 428 MB/s3.2 打包、拆包
打包和拆包速度都大於350MB/s:
# time tar -cf sendlog.tar ./sendlog/ real 0m10.996s # time tar -xf sendlog.tar real 0m11.564s3.3 壓縮、解壓縮
關於各個壓縮公用程式的效能(壓縮、解壓、壓縮率)已經有很多人做了比較,本文不做詳細討論,這裡選擇gzip/pigz lz4 bzip做本測試的比較:
| input speed | output speed | rate | speed of decoder pigz -p 16 | 327.0MB/s | 57.2MB/s | 17.5% | 95 MB/s lz4 | 288.0MB/s | 79.2MB/s | 27.5% | 264 MB/s bzip2 | 4.9MB/s | 0.65MB/s | 13.1% | 25.6MB /s
壓縮公用程式的比較測試參考:Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO
可以看到,lz4在壓縮率上略微遜色(對比pigz),但是在解壓速度上有這驚人的優勢。