復制文件
- 壓縮數據
- 發送到另外一台機器上
- 數據解壓縮
- 校驗正確性
使用ZIP+SCP
gzip -c /home/yankay/data | ssh yankay01 "gunzip -c - > /home/yankay/data"
這條命令是將/home/yankay/data經過GZIP壓縮,通過ssh傳輸到yankay01的機器上。
scp -C -c blowfish /home/yankay/data yankay01:/home/yankay/data
這樣運行效果是相同的,不通之處在於我使用了blowfish算法作為Scp的密匙算法,使用這個算法可以比默認的情況快很多。單單對與scp,使用了blowfish 吞吐量是62MB/s,不使用只有46MB/s。
性能分析
我們先定義幾個變量
- 壓縮工具的壓縮比是 CompressRadio
- 壓縮工具的壓縮吞吐是CompressSpeed MB/s
- 網絡傳輸的吞吐是 NetSpeed MB/s
由於使用了管道,管道的性能取決於管道中最慢的部分的性能,所以整體的性能是:
speed=min(NetSpeed/CompressRadio,CompressSpeed)
當壓縮吞吐較網絡傳輸慢的時候,壓縮是瓶頸;但網絡較慢的時候,網絡傳輸/吞吐 是瓶頸。
根據現有的測試數據(純文本),可以得到表格:
| 壓縮比 | 吞吐量 | 千兆網卡(100MB/s)吞吐量 | 千兆網卡吞吐量,基於ssh(62MB/s) | 百兆網卡(10MB/s)吞吐量 | |
| ZLIB | 35.80% | 9.6 | 9.6 | 9.6 | 9.6 |
| LZO | 54.40% | 101.7 | 101.7 | 101.7 | 18.38235294 |
| LIBLZF | 54.60% | 134.3 | 134.3 | 113.5531136 | 18.31501832 |
| QUICKLZ | 54.90% | 183.4 | 182.1493625 | 112.9326047 | 18.21493625 |
| FASTLZ | 56.20% | 134.4 | 134.4 | 110.3202847 | 17.79359431 |
| SNAPPY | 59.80% | 189 | 167.2240803 | 103.6789298 | 16.72240803 |
| NONE | 100% | 300 | 100 | 62 | 10 |
可以看出來。在千兆網卡下,使用QuickLZ作為壓縮算法,可以達到最高的性能。如果使用SSH作為數據傳輸通道,則遠遠沒有達到網卡可以達到的最佳性能。在百兆網卡的情況下,各個算法相近。對比下來QuickLZ是有優勢的。
對於不同的數據和不同的機器,可以得出不同的最佳壓縮算法。但有一點是肯定的,盡量把瓶頸壓在網絡上。對於較慢的網絡環境,高壓縮比的算法會比較有優勢;相反對於較快的網絡環境,低壓縮比的算法會更好。
結論
根據上面的分析結果,我們不能是用SSH作為網絡傳輸通道,可以使用NC這個基本網絡工具,提高性能。同時使用qpress作為壓縮算法。
scp /usr/bin/qpress yankay01:/usr/bin/qpress ssh yankay01 "nc -l 12345 | qpress -dio > /home/yankay/data" & qpress -o /home/yankay/data |nc yankay01 12345
第一行是將gpress安裝到遠程機器上,第二行在遠程機器上使用nc監聽一個端口,第三行壓縮並傳送數據。
執行上面的命令需要2.8s。平均吞吐量為402MB/s,比使用Gzip+Scp快了16倍!!
根據上文的公式,和自己的數據,可以繪出上面的表格,就可以選擇出最適合的壓縮算法和傳輸方式。達到滿意的效果。如果是一個長期運行的腳本的話,這么做是值得的。
