高效同步數據的方法及效率測試--邊打包邊壓縮邊傳輸邊解壓20150105

      有些時候在備份或者同步有很多文件的大目錄時(比如幾個GB或者幾十個GB的數據庫目錄、log目錄),直接scp的話花費的時間較長,雖然可以採用先壓縮再傳輸再解壓的方法,傳輸的數據量確實減少了,但壓縮和解壓也會耗費很多的時間,總體效果也不令人滿意,昨天晚上突發奇想,由於之前做過流媒體視頻點播的項目的經驗,如果能像看高清視頻一樣只需要下載完視頻文件的metadata頭就可以實現邊下載邊播放,即漸進式下載(http://baike.baidu.com/link?url=fTWQYBTqQr1BisysCAkoqIytbwotfBYvFEMxEAlspRbNmE6b5lwVLNzA-qgw6yGlFgBepYBzqvUEb2tqQaehBK) ,那就完美了,今天在網上一搜linux還真行,興奮之餘做一下對比測試:


先上結論:

(1)總體來說,對於文本文件,壓縮要比不壓縮傳輸效率更高些,但效果不明顯(因爲瓶頸不在網絡傳輸這塊,而在於壓縮,參見下文測試1與2,3與4的對比);

(2)採用邊打包邊壓縮邊傳輸邊解壓的流式傳輸方式的話,傳輸效率能比直接scp/rsync的方式提高35%

(3)具體到流式傳輸的ssh和nc的方式上,因爲nc不需要用戶驗證、不需要加密傳輸的數據,效率稍微高一點,對比效果不明顯(因爲瓶頸不在網絡傳輸這塊,而在於壓縮);

(4)在實際使用中更傾向於採用ssh的方式,因爲:可以採用push或者pull的方式,且一條命令搞定,同一個源可以有多個併發,而nc需要先在接受端監聽端口,然後在發送端開始傳輸,需要分別執行2條命令。擔心:如果在傳輸的同時有第三者同時向接收端的監聽端口發送數據,容易造成數據的不完整性,但實際測試發現nc的接受端只能和一個發送端建立連接進行數據傳輸,如果正在傳輸數據,那麼第三者發往改監聽端口的數據將不會傳輸,只有新監聽端口或者等傳輸完成後,再重新啓用改端口進行傳輸,總之還是傾向於與ssh的方式。


測試環境:centos5.5  千兆局域網絡

測試目錄/var/log大小8.9GB

[root@cap131 ~]# du -h /var/log/
28K /var/log/prelink
8.0K /var/log/conman.old
8.0K /var/log/vbox
24K /var/log/cups
50M /var/log/redis
76K /var/log/nginx
6.1M /var/log/sa
8.0K /var/log/conman
8.0K /var/log/ppp
18M /var/log/audit
152K /var/log/php-fpm
8.8G /var/log/rabbitmq
12K /var/log/pm
16K /var/log/mail
8.9G /var/log/
[root@cap131 ~]# 


1、直接純scp拷貝的時間(5‘20’‘):

[root@cap131 ~]# time scp -r /var/log/ 192.168.1.130:/root/test-dir/

real 5m20.834s
user 3m29.049s
sys 0m41.038s


2、先打包壓縮再傳輸再解壓的時間(3’33‘’+14‘’+1‘19’‘=5’6‘’):
純壓縮的時間:

[root@cap131 ~]# time tar czf  varlog.tar.gz /var/log
tar: Removing leading `/' from member names
real 3m33.740s
user 3m28.068s
sys 0m19.081s


純壓縮後的大小:

[root@cap130 test-dir]# du  -h ../varlog.tar.gz
399M ../varlog.tar.gz


純傳輸壓縮包的時間:

[root@cap131 ~]# time scp varlog.tar.gz 192.168.1.130:~
[email protected]'s password:
varlog.tar.gz                                                                                                       100%  399MB  30.7MB/s   00:13

real 0m14.024s
user 0m9.510s
sys 0m1.283s


純解壓的時間

[root@cap131 ~]# time tar xzf varlog.tar.gz
real 1m19.916s
user 0m49.498s
sys 0m35.588s


3、直接rysnc不啓用壓縮功能的傳輸時間(5‘12’‘):

[root@cap131 ~]# rsync -r /var/log/  192.168.1.130:/root/test-dir
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(260) [sender=2.6.8]
[root@cap131 ~]# time rsync -r /var/log/  192.168.1.130:/root/test-dir
[email protected]'s password:
real 5m12.625s
user 3m55.503s
sys 0m34.568s


4、直接rsync啓用壓縮功能的傳輸時間(4’36‘’):

[root@cap131 ~]# time rsync -zr /var/log/  192.168.1.130:/root/test-dir
real 4m35.991s
user 4m40.208s
sys 0m5.306s


5、邊打包邊壓縮邊傳輸邊解壓的時間(採用ssh遠程執行命令的push方式):

[root@cap131 ~]# time tar czf - /var/log  |ssh  192.168.1.130  tar xzf -  -C /root/test-dir/
tar: Removing leading `/' from member names
real 3m33.711s
user 3m37.066s
sys 0m22.210s


 邊打包邊壓縮邊傳輸邊解壓的時間(採用ssh遠程執行命令的pull方式):

[root@cap130 test-dir]# time ssh  192.168.1.131  tar czf  -  /var/log |tar xzf - -C /root/test-dir/
tar: Removing leading `/' from member names
real 3m33.772s
user 1m13.207s
sys 0m55.302s



6、邊打包邊壓縮邊傳輸邊解壓的時間(採用nc push的方式):

接受端監聽端口10086:

[root@cap130 test-dir]# nc -l 10086 |tar xzf - -C /root/test-dir/

發送端開始傳輸:

[root@cap131 ~]# time tar czf - /var/log |nc 192.168.1.130 10086
tar: Removing leading `/' from member names
real 3m31.218s
user 3m27.908s
sys 0m15.839s


邊打包邊壓縮邊傳輸邊解壓的時間(採用nc pull的方式):

這種方式好像行不通!


EOF



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章