我們經(jīng)常需要在機(jī)器之間傳輸文件。比如備份,復(fù)制數(shù)據(jù)等等。這個是很常見,也是很簡單的。用scp或者rsync就能很好的完成任務(wù)。但是如果文件很大,需要占用一些傳輸時間的時候,怎樣又快又好地完成任務(wù)就很重要了。在我的測試用例中,一個的方案比差的方案,性能提高了10倍。
復(fù)制文件
如果我們是復(fù)制一個未壓縮的文件。這里走如下步驟:
壓縮數(shù)據(jù)
發(fā)送到另外一臺機(jī)器上
數(shù)據(jù)解壓縮
校驗(yàn)正確性
這樣做會很有效率,數(shù)據(jù)壓縮后可以更有效的利用帶寬
使用ZIP+SCP
我們可以通過ZIP+SCP的組合實(shí)現(xiàn)這個功能。
gzip -c /home/yankay/data | ssh yankay01 "gunzip -c - > /home/yankay/data"這條命令是將/home/yankay/data經(jīng)過GZIP壓縮,通過ssh傳輸?shù)統(tǒng)ankay01的機(jī)器上。
data文件的大小是1.1GB,經(jīng)過Zip壓縮后是183MB,執(zhí)行上面的命令需要45.6s。平均吞吐量為24.7MB/s
我們會發(fā)現(xiàn)Scp也有壓縮功能,所以上面的語句可以寫成
scp -C -c blowfish /home/yankay/data yankay01:/home/yankay/data這樣運(yùn)行效果是相同的,不通之處在于我使用了blowfish算法作為Scp的密匙算法,使用這個算法可以比默認(rèn)的情況快很多。單單對與scp,使用了blowfish 吞吐量是62MB/s,不使用只有46MB/s。
可是我執(zhí)行上面一條命令的時候,發(fā)現(xiàn)還是需要45s。平均吞吐量還為24MB/s。沒有絲毫的提升,可見瓶頸不在網(wǎng)絡(luò)上。
那瓶頸在哪里呢?
性能分析
我們先定義幾個變量
壓縮工具的壓縮比是 CompressRadio
壓縮工具的壓縮吞吐是CompressSpeed MB/s
網(wǎng)絡(luò)傳輸?shù)耐掏率?NetSpeed MB/s
由于使用了管道,管道的性能取決于管道中慢的部分的性能,所以整體的性能是:
speed=min(NetSpeed/CompressRadio,CompressSpeed)
當(dāng)壓縮吞吐較網(wǎng)絡(luò)傳輸慢的時候,壓縮是瓶頸;但網(wǎng)絡(luò)較慢的時候,網(wǎng)絡(luò)傳輸/吞吐 是瓶頸。
根據(jù)現(xiàn)有的測試數(shù)據(jù)(純文本),可以得到表格:
壓縮比 吞吐量 千兆網(wǎng)卡(100MB/s)吞吐量 千兆網(wǎng)卡吞吐量,基于ssh(62MB/s) 百兆網(wǎng)卡(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 300 100 62 可以看出來。在千兆網(wǎng)卡下,使用QuickLZ作為壓縮算法,可以達(dá)到的性能。如果使用SSH作為數(shù)據(jù)傳輸通道,則遠(yuǎn)遠(yuǎn)沒有達(dá)到網(wǎng)卡可以達(dá)到的性能。在百兆網(wǎng)卡的情況下,各個算法相近。對比下來QuickLZ是有優(yōu)勢的。 對于不同的數(shù)據(jù)和不同的機(jī)器,可以得出不同的壓縮算法。但有一點(diǎn)是肯定的,盡量把瓶頸壓在網(wǎng)絡(luò)上。對于較慢的網(wǎng)絡(luò)環(huán)境,高壓縮比的算法會比較有優(yōu)勢;相反對于較快的網(wǎng)絡(luò)環(huán)境,低壓縮比的算法會更好。 結(jié)論 根據(jù)上面的分析結(jié)果,我們不能是用SSH作為網(wǎng)絡(luò)傳輸通道,可以使用NC這個基本網(wǎng)絡(luò)工具,提高性能。同時使用qpress作為壓縮算法。 scp /usr/bin/qpress yankay01:/usr/bin/qpress 執(zhí)行上面的命令需要2.8s。平均吞吐量為402MB/s,比使用Gzip+Scp快了16倍!! 根據(jù)上文的公式,和自己的數(shù)據(jù),可以繪出上面的表格,就可以選擇出適合的壓縮算法和傳輸方式。達(dá)到滿意的效果。如果是一個長期運(yùn)行的腳本的話,這么做是值得的。
ssh yankay01 "nc -l 12345 | qpress -dio > /home/yankay/data" &
qpress -o /home/yankay/data |nc yankay01 12345行是將gpress安裝到遠(yuǎn)程機(jī)器上,第二行在遠(yuǎn)程機(jī)器上使用nc監(jiān)聽一個端口,第三行壓縮并傳送數(shù)據(jù)。