GNU Paralel kullanarak rsync'i paralelleştirin


19

rsyncBir ana bilgisayardaki verileri başka bir ana bilgisayardaki verilerle senkronize etmek için bir komut dosyası kullanıyorum . Veriler neredeyse 1.2 TB'a katkıda bulunan çok sayıda küçük boyutlu dosyaya sahiptir.

Bu dosyaları senkronize etmek için rsyncaşağıdaki komutu kullanıyorum :

rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/

Proj.lst içeriği aşağıdaki gibidir:

+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *

Test olarak, bu projelerden ikisini (8.5GB veri) aldım ve yukarıdaki komutu uyguladım. Ardışık bir süreç olarak, tamamlanması 14 dakika 58 saniye aracıdır. Yani, 1.2 TB veri için birkaç saat sürecek.

Birden olabilir istiyorsanız rsyncparalel süreçler (kullanarak &, xargsya da parallel), benim zamandan tasarruf ediyorum.

Aşağıdaki komut ile çalıştı parallel( cdkaynak dizine ing sonra ) ve yürütmek için 12 dakika 37 saniye sürdü:

parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .

Bu 5 kat daha az zaman almalıydı, ama olmadı. Sanırım, bir yerlerde yanlış gidiyorum.

rsyncYürütme süresini azaltmak için birden çok işlemi nasıl çalıştırabilirim ?


1
Ağ bant genişliği ile sınırlı mısınız? Disk iops? Disk bant genişliği?
Ole Tange

Mümkünse, toplam bant genişliğinin% 50'sini kullanmak isteriz. Ancak, çoklu rsyncs'yi paralelleştirmek ilk önceliğimizdir.
Mandar Shinde

Şunlarınızı bize bildirir misiniz: Ağ bant genişliği, disk iops, disk bant genişliği ve gerçekte kullanılan bant genişliği?
Ole Tange

Aslında, yukarıdaki parametreleri bilmiyorum. Şimdilik optimizasyon bölümünü ihmal edebiliriz. rsyncParalel çoklu s şimdi birincil odak noktası.
Mandar Shinde

Sınırlama CPU değilse paralel gitmenin anlamı yok. Konuları daha da kötüleştirebilir (hatta kaynak diskte veya hedef diskte çakışan disk kolu hareketleri).
xenoid

Yanıtlar:


16

Aşağıdaki adımlar benim için işi yaptı:

  1. rsync --dry-runEtkilenecek dosyaların listesini almak için ilkini çalıştırın .
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
    --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
  1. I çıkışını beslenen cat transfer.logiçin parallel5 çalıştırmak için rsyncaşağıdaki şekilde, paralel s:
$ cat /tmp/transfer.log | \
    parallel --will-cite -j 5 rsync -avzm --relative \
      --stats --safe-links --ignore-existing \
      --human-readable {} REMOTE-HOST:/data/ > result.log

Burada, --relativeseçenek ( link ) etkilenen dosyaların dizin yapısının kaynak ve hedefte aynı kalmasını sağladı ( /data/dizin içinde ), bu nedenle komutun kaynak klasörde çalıştırılması gerekir (örneğin, /data/projects).


5
Bu dosya başına bir rsync yapardı. Büyük olasılıkla tüm dosya listesini bölmek splitve bu dosya adlarını paralel olarak beslemek daha verimli olacaktır . Daha sonra --files-fromdosya adlarını her dosyadan almak ve senkronize etmek için rsync'i kullanın . rm yedekleri. * split -l 3000 backup.list yedekleri. ls yedekleri. * | paralel - satır ara belleği --verbose -j 5 rsync --geliş -av --dosyaları - {} / LOCAL / PARENT / PATH / REMOTE_HOST: REMOTE_PATH /
Sandip Bhattacharya

1
İkinci rsync komutu, results.log dosyasında dosya olmayan satırları nasıl işler? yani receiving file list ... done created directory /data/.
Mike D

1
Yeni rsync (3.1.0+) sürümlerinde, --info=nameyerine kullanabilirsiniz -vve yalnızca dosya ve dizin adlarını alırsınız. Herhangi bir dosyada boşluk veya kabuk metakarakterleri varsa, rsync'i aktararak 'protect-args' öğesini 'rsync' transfer etmek de kullanabilirsiniz.
Çita

13

Şahsen bu basit olanı kullanıyorum:

ls -1 | parallel rsync -a {} /destination/directory/

Yalnızca boş olmayan birkaç dizinden daha fazlasına sahip olduğunuzda kullanışlıdır, aksi takdirde neredeyse her rsyncsonlandırmayı ve sonuncuyu tek başına tüm işi yaparsınız .


Bu harika çalışıyor - bir şey yapıp yapmadığını bilmek zor, bu yüzden -v'ye paralel onu daha konuşkan hale getiriyor. Ayrıca, -j 30 to paralel (yani rsync komutundan önce) varsayılan olarak CPU çekirdeği başına bir tane değil, 30 iş çalıştırır.
Criggie

12

Herkesin kabul edilen cevabı kullanmasını şiddetle tavsiye etmem, daha iyi bir çözüm üst düzey dizini taramak ve orantılı sayıda rync işlemi başlatmaktır.

Ben büyük bir zfs hacmi var ve kaynak cifs montaj oldu. Her ikisi de 10G ile bağlantılıdır ve bazı kriterlerde bağlantıyı doyurabilir. Performans kullanılarak değerlendirildi zpool iostat 1.

Kaynak sürücü aşağıdaki gibi monte edildi:

mount -t cifs -o username=,password= //static_ip/70tb /mnt/Datahoarder_Mount/ -o vers=3.0

Tek bir rsyncişlem kullanma :

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/ /StoragePod

io metre şunu okur:

StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.62K      0   130M

Bu sentetik testlerde (kristal disk), sıralı yazma performansı 900 MB / s'ye yaklaşır, bu da bağlantının doygun olduğu anlamına gelir. 130MB / s çok iyi değil ve bir hafta sonu ve iki hafta beklemek arasındaki fark.

Bu yüzden, dosya listesini oluşturdum ve senkronizasyonu tekrar çalıştırmayı denedim (64 çekirdekli bir makinem var):

cat /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount.log | parallel --will-cite -j 16 rsync -avzm --relative --stats --safe-links --size-only --human-readable {} /StoragePod/ > /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount_result.log

ve aynı performansa sahipti!

StoragePod  29.9T   144T      0  1.63K      0   130M
StoragePod  29.9T   144T      0  1.62K      0   130M
StoragePod  29.9T   144T      0  1.56K      0   129M

Alternatif olarak sadece kök klasörlerde rsync koştu:

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/Marcello_zinc_bone /StoragePod/Marcello_zinc_bone
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/fibroblast_growth /StoragePod/fibroblast_growth
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/QDIC /StoragePod/QDIC
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/sexy_dps_cell /StoragePod/sexy_dps_cell

Bu aslında performansı artırdı:

StoragePod  30.1T   144T     13  3.66K   112K   343M
StoragePod  30.1T   144T     24  5.11K   184K   469M
StoragePod  30.1T   144T     25  4.30K   196K   373M

Sonuç olarak, @Sandip Bhattacharya'nın gündeme getirdiği gibi, dizinleri almak ve buna paralel olarak küçük bir senaryo yazın. Alternatif olarak, rsync'e bir dosya listesi iletin. Ancak her dosya için yeni örnekler oluşturmayın.


5

Paralel hale getirilmiş rsync'i test etmenin bir yolu şudur: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync

rsync harika bir araçtır, ancak bazen kullanılabilir bant genişliğini doldurmaz. Yüksek hızlı bağlantılar üzerinden birkaç büyük dosyayı kopyalarken bu genellikle bir sorundur.

Aşağıdaki sunucu fooserver üzerinde dest-dir için src-dir büyük dosya başına bir rsync başlayacaktır:

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{} 

Oluşturulan dizinler yanlış izinlerle sonuçlanabilir ve daha küçük dosyalar aktarılmaz. Bu rsync'i son kez çalıştırmak için:

rsync -Havessh src-dir/ fooserver:/dest-dir/ 

Veri gönderemiyorsanız, ancak bunları çekmeniz gerekiyorsa ve dosyalara digits.png (örn. 000000.png) denirse şunları yapabilirsiniz:

seq -w 0 99 | parallel rsync -Havessh fooserver:src/*{}.png destdir/

Bundan kaçınmak için başka bir alternatif var findmı?
Mandar Shinde

1
Bulmanın -maksuppth değerini sınırlayın.
Ole Tange

İn --dry-runseçeneğini kullanırsam rsync, aktarılacak dosyaların bir listesi olurdu. parallelSüreci paralel hale getirmek için bu dosya listesini sağlayabilir miyim ?
Mandar Shinde

1
kedi dosyaları | paralel -v ssh fooserver mkdir -p / dest-dir / {//} \; rsync -s -Havessh {} fooserver: / dest-dir / {}
Ole Tange

Parçayı açıklar mkdir -p /dest-dir/{//}\;mısınız? Özellikle de {//}biraz kafa karıştırıcı.
Mandar Shinde

1

Çok hedefli senkronizasyonlar için kullanıyorum

parallel rsync -avi /path/to/source ::: host1: host2: host3:

İpucu: Tüm ssh bağlantıları, ~/.ssh/authorized_keys


1

Her zaman tam komutu unuttuğumdan paralel rsync için google, ancak istediğim gibi hiçbir çözüm işe yaramadı - birden fazla adım içeriyor veya yüklemesi gerekiyor parallel. Birden fazla klasörü senkronize etmek için bu tek astarı kullandım:

find dir/ -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo dir/%/ host:/dir/%/)'

-P 5 yumurtlamak istediğiniz süreçlerin miktarıdır - sınırsız için 0 kullanın (kesinlikle önerilmez).

--bwlimit tüm bant genişliğini kullanmaktan kaçınmak için.

-I %arg tarafından sağlanan argüman (dizinde bulundu dir/)

$(echo dir/%/ host:/dir/%/)- rsync tarafından bağımsız değişken olarak okunan kaynak ve hedef dizinleri yazdırır. %, xargsile bulunan dizin adı ile değiştirilir find.

Diyelim ki iki dizinim var /home: dir1ve dir2. Ben koşarım find /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'. Bu nedenle rsync komutu /homeaşağıdaki bağımsız değişkenlerle iki işlem ( iki dizin olduğu için iki işlem) olarak çalışacaktır :

rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
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.