gzip -c /home/yankay/data | ssh yankay01 "gunzip -c - > /home/yankay/data"
這條命令是將/home/yankay/data經過GZIP壓縮,通過ssh傳輸到yankay01的機器上。
data文件的大小是1.1GB,經過Zip壓縮後是183MB,執行上面的命令需要45.6s。平均吞吐量為24.7MB/s 我們會發現Scp也有壓縮功能,所以上面的語句可以寫成scp -C -c blowfish /home/yankay/data yankay01:/home/yankay/data
這樣運行效果是相同的,不通之處在於我使用了blowfish算法作為Scp的密匙算法,使用這個算法可以比默認的情況快很多。單單對與scp,使用了blowfish 吞吐量是62MB/s,不使用只有46MB/s。
可是我執行上面一條命令的時候,發現還是需要45s。平均吞吐量還為24MB/s。沒有絲毫的提升,可見瓶頸不在網絡上。 那瓶頸在哪裡呢?我們先定義幾個變量
由於使用了管道,管道的性能取決於管道中最慢的部分的性能,所以整體的性能是:
當壓縮吞吐較網絡傳輸慢的時候,壓縮是瓶頸;但網絡較慢的時候,網絡傳輸/吞吐 是瓶頸。
根據現有的測試數據(純文本),可以得到表格:
可以看出來。在千兆網卡下,使用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倍!!
根據上文的公式,和自己的數據,可以繪出上面的表格,就可以選擇出最適合的壓縮算法和傳輸方式。達到滿意的效果。如果是一個長期運行的腳本的話,這麼做是值得的。