tar + rsync + untar. Sadece rsync üzerinden herhangi bir hız avantajı var mı?


25

Sık sık kendimi uzak bir makineye (kampüste aynı ağ içinde) 10K - 100K dosya içeren klasörler gönderirken buluyorum.

Sadece buna inanmak için sebep olup olmadığını merak ediyordum.

 tar + rsync + untar

Ya da sadece

 tar (from src to dest) + untar

pratikte daha hızlı olabilirdi

rsync 

ilk kez dosyaları aktarırken .

Yukarıdakileri iki senaryoda ele alan bir cevapla ilgileniyorum: Sıkıştırma kullanmak ve kullanmamak.

Güncelleştirme

Sadece 10.000 küçük dosyayı (toplam boyut = 50 MB) taşıyarak bazı deneyler yürüttüm ve doğrudan (sıkıştırılmadan) her ikisinden de doğrudan tar+rsync+untarçalışmaktan daha hızlıydı rsync.


Rsync'i diğer tarafta daemon modunda mı çalıştırıyorsunuz?
JBRWilkinson

4
Yeniden. yardımcı sorunuz:tar cf - . | ssh remotehost 'cd /target/dir && tar xf -'
Gilles 'KÖTÜ-kötü olmayı'

3
Küçük dosyaları tek tek rsync veya scp ile senkronize etmek, her dosyanın net üzerinden en az bir kendi veri paketini başlatmasına neden olur. Dosya küçükse ve paketler çoksa, bu, protokol ek yükünün artmasına neden olur. Şimdi, her dosya için rsync protokolü (birden fazla sağlama, karşılaştırma, karşılaştırma ...) yoluyla birden fazla veri paketi bulunduğunu, protokol yükünün hızlı bir şekilde oluştuğunu sayın. MTU boyutunda Vikipedi'yi
Tatjana Heuser

Thanks @TatjanaHeuser - cevabınıza bunu eklerseniz ve rsync'in dosya başına en az bir paket kullandığı iddiasını yedeklemeyi sakıncası yoksa, kabul ediyorum.
Amelio Vazquez-Reina,

1
Scp ve rsync ile gecikmenin farklı nedenlerden ötürü suçlanacağını belirten ilginç bir okuma buldum : scp temelde tanımladığım gibi davranıyor, ancak bunun için büyük veri yapıları oluşturma maliyetini arttırarak ağ yükünü optimize ediyor. Bunu cevabımı ekledim ve bu hafta sonu kontrol edeceğim.
Tatjana Heuser,

Yanıtlar:


24

Aynı dosya grubunu gönderdiğinizde, rsyncyalnızca farklılıklar göndereceği için daha uygundur. tarher zaman her şeyi gönderir ve bu, çoğu veri zaten varsa, bu bir kaynak israfıdır. tar + rsync + untarBu durumda bu avantajı yanı sıra ile senkronize klasörleri tutma avantajına kaybeder rsync --delete.

Dosyaları ilk kez kopyalarsanız, önce paketler, sonra gönderir, sonra da paketten çıkarırsınız (AFAIK rsyncborulu girdiler almaz) zahmetlidir ve her zaman sadece rsyncing'den daha kötüdür, çünkü zaten rsyncherhangi bir işlem yapmak zorunda kalmazsınız tar.

İpucu: rsync sürüm 3 veya üstü, artımlı özyineleme yapar, yani tüm dosyaları saymadan hemen önce kopyalamaya başlar.

Tip2: Eğer kullanırsanız rsyncüzerinde ssh, ayrıca herhangi birini kullanabilirsiniztar+ssh

tar -C /src/dir -jcf - ./ | ssh user@server 'tar -C /dest/dir -jxf -'

ya da sadece scp

scp -Cr srcdir user@server:destdir

Genel kural, basit olsun.

GÜNCELLEŞTİRME:

59M demo verilerini oluşturdum

mkdir tmp; cd tmp
for i in {1..5000}; do dd if=/dev/urandom of=file$i count=1 bs=10k; done

ve her iki yöntemi de kullanarak birkaç kez dosya aktarımını uzak bir sunucuya (aynı satırda değil) test etti.

time rsync -r  tmp server:tmp2

real    0m11.520s
user    0m0.940s
sys     0m0.472s

time (tar cf demo.tar tmp; rsync demo.tar server: ; ssh server 'tar xf demo.tar; rm demo.tar'; rm demo.tar)

real    0m15.026s
user    0m0.944s
sys     0m0.700s

gönderilen günlükleri ssh trafik paketlerinden ayrı tutarken

wc -l rsync.log rsync+tar.log 
   36730 rsync.log
   37962 rsync+tar.log
   74692 total

Bu durumda, varsayılan mtu 1500 olduğunda ve dosyalar 10k boyutunda iken beklenen rsync + tar kullanarak daha az ağ trafiğinde bir avantaj göremiyorum. rsync + tar daha çok trafik üretti, 2-3 saniye daha yavaştı ve temizlenmesi gereken iki çöp dosyasını bıraktı.

Aynı lan üzerinde iki makinede aynı testleri yaptım ve orada rsync + tar daha iyi zamanlar ve çok daha az ağ trafiği yaptı. Jumbo çerçevelerin nedenini varsayıyorum.

Belki de rsync + tar, çok daha büyük bir veri setindeki rsync'ten daha iyi olacaktır. Ama açıkçası, bunun bir zahmete değeceğini sanmıyorum, her iki tarafta da paketleme ve açma işlemleri için iki alana ihtiyacınız var ve yukarıda da belirttiğim gibi birkaç seçenek daha var.


Aslında. "Sadece ihtiyaç duyulan" önemli bir husustur, bazen asılsız olmasına rağmen, bu canavar denir rsync;)
0xC0000022L 20

2
Btw zrsync ile bayrak kullanırsanız bağlantıyı sıkıştıracaktır. Günümüzde sahip olduğumuz CPU gücü ile, sıkıştırma, kaydettiğiniz bant genişliği miktarına kıyasla önemsizdir; bu, metin dosyaları için sıkıştırılmamış ~
Populus

1
@Populus, orijinal cevabımda sıkıştırma kullandığımı fark edeceksiniz. Ancak daha sonra eklediğim testlerde o kadar önemli değil, urandom verileri çok fazla sıkıştırmıyor.
forcefsck,

8

rsyncayrıca sıkıştırma yapar. -zBayrağı kullan . Üzerinde çalışan varsa ssh, ayrıca ssh'nin sıkıştırma modunu kullanabilirsiniz. Benim düşüncem, tekrarlanan sıkıştırma seviyelerinin faydalı olmadığı yönünde; sadece önemli sonuçlar olmadan döngüleri yakacaktır. rsyncSıkıştırma ile deneme yapmanızı öneririm . Oldukça etkili görünüyor. Ve tarherhangi bir ön / son sıkıştırma işleminin kullanımını veya atlanmasını öneririm .

Genellikle rsync'i kullanıyorum rsync -abvz --partial....


Not olduğunu rsyncbelli ekleri dahil olan dosyaları sıkıştırarak varsayılan atlama tarafından .gzve .tgzdiğerleri; tam liste için rsyncman sayfasını arayın --skip-compress.
Joker,

5

Bugün ev dizinimi NAS'a yedeklemek zorunda kaldım ve sonuçlarımı ekleyeceğimi düşündüm. Uzun lafın kısası, ağ üzerinden hedef dosya sistemine katıştırmak, benim ortamımda aynı hedefe yönelmekten çok daha hızlı.

Çevre: SSD sabit disk kullanarak Kaynak makinesi i7 masaüstü. Hedef makine Synology NAS DS413j, Kaynak makineye gigabit lan bağlantısıyla.

İçerdiği kitin tam özelliği, performansı doğal olarak etkiler ve her bir uçta ağ donanımının kalitesiyle ilgili tam kurulumumun ayrıntılarını bilmiyorum.

Kaynak dosyalar, 1.2Gb çoğunlukla çok küçük dosyalar içeren ~ / .cache klasörümdür.

1a/ tar files from source machine over the network to a .tar file on remote machine

$ tar cf /mnt/backup/cache.tar ~/.cache

1b/ untar that tar file on the remote machine itself

$ ssh admin@nas_box
[admin@nas_box] $ tar xf cache.tar

2/ rsync files from source machine over the network to remote machine

$ mkdir /mnt/backup/cachetest
$ rsync -ah .cache /mnt/backup/cachetest

Görevi göstermek için 1a ve 1b'yi tamamen ayrı adımlar halinde tuttum. Pratik uygulamalar için Gilles’un yukarıda yayınlananları ssh üzerinden alıcının üzerindeki geciktirme işlemine katranlı boru çıkışıyla tavsiye ederim.

Zamanlamaları:

1a - 33 seconds

1b - 1 minutes 48 seconds

2 - 22 minutes

Rsync'in yukarıda bahsedilen her iki ağ performansına atfedilebilecek olan bir tar işlemine kıyasla şaşırtıcı derecede düşük performans gösterdiği çok açık.

Giriş dizini yedekleme gibi çoğunlukla küçük dosyaları büyük miktarda yedeklemek isteyen herkese tar yaklaşımını kullanmasını öneririm. rsync çok zayıf bir seçim gibi görünüyor. İşlemimden herhangi birinde yanlış olduğumu düşünüyorsam, bu yazıya geri döneceğim.

Nick


1
Kullanmadan -zsıkıştırma yapmak rsync olması, bu test tamamlanmamış görünüyor.
Joker,

1
zKullandığım gibi kendi bağımsız değişkeni olmayan Tar , verileri sıkıştırmaz (bkz. Unix.stackexchange.com/questions/127169/… ). Katran çıktısını bzip2 veya gzip gibi bir sıkıştırma kütüphanesinden geçiriyor olsaydım, evet, -zmantıklı olurdu.
Neek

3

İstediğiniz gibi bir tar arşivi göndermek için rsync kullanmak, işleme bir doğrulama katmanı ekleyeceğiniz için aslında bir israf veya kaynak olacaktır. Tek tek dosyaları kontrol etmeyi tercih ettiğinizde, Rsync tar dosyasını doğruluğu için kontrol eder. (Gönderen tarafında arızalı olabilecek tar dosyasının zaten alıcı tarafta aynı etkiyi gösterdiğini bilmek yardımcı olmaz). Bir arşiv gönderiyorsanız, ihtiyacınız olan tek şey ssh / scp.

Bir arşiv göndermeyi seçmenizin bir nedeni, seçtiğiniz katranın Erişim Kontrolü Listesi veya Genişletilmiş Öznitelikler'de (Solaris) veya Ressource Forks'ta (MacOS) sıkça depolanan diğer Meta Veriler gibi daha fazla dosya sistemi özel özelliğini koruyabilmesiydi. ). Bu tür şeylerle uğraşırken, asıl endişeniz, hangi dosyaların kaynak dosya sistemindeki dosyayla ilişkili tüm bilgileri koruyabildiği ve hedef dosya sisteminin de onları takip edebilme yeteneğine sahip olması olacaktır.

Hız, asıl endişeniz olduğunda, dosyalarınızın boyutuna çok bağlıdır. Genel olarak, çok sayıda küçük dosya rsync veya scp üzerinde kötü ölçeklenir, çünkü hepsi bir tar dosyasının tek tek bir ağ paketinin veri yüküne dahil edeceği tek tek ağ paketlerini boşa harcar. Eğer tar dosyası sıkıştırılmış olsaydı daha da iyidir, çünkü küçük dosyalar muhtemelen bir bütün olarak bir bütün olarak daha iyi sıkıştırılırdı. Bildiğim kadarıyla, hem rsync hem de scp, ilk dosya aktarımında olduğu gibi tüm dosyaları tek tek gönderirken optimize edilemiyor, her dosyanın tüm protokol ek yükü ile tüm veri çerçevelerini işgal etmesini sağlamak (ve ileri ve geri kontrol etmek için daha fazla harcıyor). Ancak Janecekbunun sadece scp için doğru olduğunu, rsync'in ağ trafiğini optimize edeceğini, ancak bellekte devasa veri yapıları oluşturmanın maliyetini düşürdüğünü belirtir. Bkz. Verimli Dosya Transferi, Janecek 2006 . Bu nedenle, ona göre hem scp hem de rsync'in küçük dosyalar üzerinde çok kötü ölçeklendiği, ancak tamamen farklı nedenlerden dolayı hala doğru olduğu. Öğrenmek için bu haftasonu kaynakları araştırmam gerekecek sanırım.

Pratik alaka düzeyi için, çoğunlukla daha büyük dosyalar gönderdiğinizi biliyorsanız, hız bakımından çok fazla bir fark olmaz ve rsync kullanmak, kesildiğinde kaldığı yerden devam edebilme avantajına sahiptir.

Postscriptum: Bu gün, rdist unutuluyor gibi gözüküyor, ama rsync günlerinden önce, çok yetenekli bir araçtı ve yaygın olarak kullanılıyordu (ssh üzerinde kullanıldığında, aksi takdirde güvensiz). Sadece değişen içeriği aktarmak için optimize etmediğinden rsync kadar iyi bir performans sergilemem. Rsync ile olan temel farkı, yapılandırma biçiminde ve dosyaları güncelleme kurallarının nasıl yazıldığına bağlıdır.


Rsync bir doğrulama katmanı eklemiyor. Sonucu doğrulamak için yalnızca mevcut dosyalardaki farklılıkları bulmak için sağlama toplamı kullanır. Kopyanın taze olduğu durumlarda, sağlama toplamı yapılmaz. Kopyanın taze olmaması durumunda, sağlama toplamı size bant genişliğinden tasarruf etmenizi sağlar.
forcefsck

2

Küçük dizinler için (kullanılan disk alanında olduğu gibi küçük), senkronize edilmekte olan dosyalar için dosya bilgilerinin kontrolünün ek yüküne bağlıdır. Bir yandan, rsyncdeğiştirilmemiş dosyaların aktarılması için zaman kazandırır, diğer yandan her dosya hakkında bilgi aktarması gerekir.

Ben içini tam olarak bilmiyorum rsync. Dosya istatistiklerinin gecikmeye neden olup olmadığı rsyncverilerin transferinin nasıl yapıldığına bağlıdır - dosya istatistikleri birer birer aktarılırsa, RTT tar + rsync + untartar'ı daha hızlı hale getirebilir.

Ama eğer varsa, 1 GiB veri diyelim, bağlantınız gerçekten hızlı olmadığı sürece, rsync çok daha hızlı olacak!


1

Ülke genelinde bir kaç terabayt veriyi bir kez taşımak zorunda kaldım. Bir deney olarak, iki karşılaştırmayı kullanarak rsyncve ssh/tarnasıl karşılaştırıldıklarını görmek için kullandım .

Sonuçlar:

  • rsync dosyaları saniyede ortalama 2,76 megabayt hızında aktardı.
  • ssh/tar dosyaları saniyede ortalama 4,18 megabayt hızında aktardı.

Ayrıntılar: Verilerim, ortalama boyutu 10 megabayt olan, ancak bir kısmı gigabaytın üstünde olan milyonlarca .gz sıkıştırılmış dosyadan oluşur. Bir dizin yapısı var ancak dosya içindeki verilerin boyutuna göre cüce. Yapacak başka bir şeyim olsaydı sadece kullanırdım, rsyncama bu durumda ssh/tarişlevsel bir çözüm.

Benim işim rsyncşunlardan oluşur:

rsync --compress --stats --no-blocking-io --files-from=fileList.txt -av otherSystem:/the/other/dir/ dest/

fileList.txt, diğer taraftaki dosyaların göreceli yol adlarının büyük ve uzun bir listesidir. (Başladıktan --compresssonra sıkıştırılmış dosyalar için verimli olmadığını fark ettim ancak yeniden başlatmaya geri dönmeyeceğim.)

Başka bir ssh ve tar ile başladı:

ssh otherSystem "cd /the/other/dir/;  tar cf - ." | tar xvf -

Her şeyin kopyalarını göreceksiniz, pardon bu elma karşılaştırmasında% 100 elma değil.

Dahili şirket ağını kullanırken, veri kaynak bilgisayarına ulaşmak için bir aracı kullanmam gerektiğini de eklemeliyim. Hedef bilgisayarımdan araca ping süresi 21 ms'dir ve aracılıktan veri kaynağına kadar olan süre 26 ms'dir. Bu, her iki transfer için de aynıydı.

Aracı üzerinden SSL bağlantısı aşağıdakiler aracılığıyla gerçekleştirilir ~/.ssh/config:

Host otherSystem
    Hostname dataSource.otherSide.com
    User myUser
    Port 22
    ProxyCommand ssh -q -W %h:%p intermediary.otherSide.com
    IdentityFile   id_rsa.priv

Güncelleme: ssh / tar transferine altı saat kala, sistemim veri taşıdığım SAN cihazıyla olan bağlantıyı kesmeye karar verdi. Şimdi neyin aktarıldığını, neyin aktarılmadığını, muhtemelen rsync ile yapacağımı bulmak zorunda kalacağım. Bazen, zaman kazanmak için harcamak zorunda kalmaya değmez.
user1683793

0

Zaman bu:

tar cf - ~/.cache | ssh admin@nas_box "(cd /destination ; tar xf -)"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.