2014-06-05 12 views
24

Wir müssen 15TB von Daten von einem Server zum anderen so schnell wie möglich übertragen. Wir verwenden derzeit rsync, aber wir bekommen nur Geschwindigkeiten um 150Mb/s, wenn unser Netzwerk 900+Mb/s (getestet mit iperf) fähig ist. Ich habe Tests der Festplatten, Netzwerk, etc und dachte, es ist nur, dass rsync nur eine Datei zu einem Zeitpunkt überträgt, die die Verlangsamung verursacht.Beschleunigen Sie Rsync mit simultanen/gleichzeitigen Dateiübertragungen?

Ich habe ein Skript gefunden, um ein anderes rsync für jeden Ordner in einer Verzeichnisstruktur auszuführen (so dass Sie auf x beschränken können), aber ich kann es nicht funktionieren, es läuft immer nur ein rsync nach dem anderen.

Ich fand die scripthere (kopiert unten).

Unser Verzeichnisbaum ist wie folgt:

/main 
    - /files 
     - /1 
     - 343 
      - 123.wav 
      - 76.wav 
     - 772 
      - 122.wav 
     - 55 
      - 555.wav 
      - 324.wav 
      - 1209.wav 
     - 43 
      - 999.wav 
      - 111.wav 
      - 222.wav 
     - /2 
     - 346 
      - 9993.wav 
     - 4242 
      - 827.wav 
     - /3 
     - 2545 
      - 76.wav 
      - 199.wav 
      - 183.wav 
     - 23 
      - 33.wav 
      - 876.wav 
     - 4256 
      - 998.wav 
      - 1665.wav 
      - 332.wav 
      - 112.wav 
      - 5584.wav 

Also, was ich passieren möchte ein rsync für jedes der Verzeichnisse in/main/Dateien zu erstellen, bis zu einem Maximum von, sagen wir, 5 auf einmal. In diesem Fall würden 3 rsyncs laufen, für /main/files/1, /main/files/2 und /main/files/3.

Ich habe versucht, mit ihm so, aber es läuft nur 1 rsync zu einem Zeitpunkt für die /main/files/2 Ordner:

#!/bin/bash 

# Define source, target, maxdepth and cd to source 
source="/main/files" 
target="/main/filesTest" 
depth=1 
cd "${source}" 

# Set the maximum number of concurrent rsync threads 
maxthreads=5 
# How long to wait before checking the number of rsync threads again 
sleeptime=5 

# Find all folders in the source directory within the maxdepth level 
find . -maxdepth ${depth} -type d | while read dir 
do 
    # Make sure to ignore the parent folder 
    if [ `echo "${dir}" | awk -F'/' '{print NF}'` -gt ${depth} ] 
    then 
     # Strip leading dot slash 
     subfolder=$(echo "${dir}" | sed '[email protected]^\./@@g') 
     if [ ! -d "${target}/${subfolder}" ] 
     then 
      # Create destination folder and set ownership and permissions to match source 
      mkdir -p "${target}/${subfolder}" 
      chown --reference="${source}/${subfolder}" "${target}/${subfolder}" 
      chmod --reference="${source}/${subfolder}" "${target}/${subfolder}" 
     fi 
     # Make sure the number of rsync threads running is below the threshold 
     while [ `ps -ef | grep -c [r]sync` -gt ${maxthreads} ] 
     do 
      echo "Sleeping ${sleeptime} seconds" 
      sleep ${sleeptime} 
     done 
     # Run rsync in background for the current subfolder and move one to the next one 
     nohup rsync -a "${source}/${subfolder}/" "${target}/${subfolder}/" </dev/null >/dev/null 2>&1 & 
    fi 
done 

# Find all files above the maxdepth level and rsync them as well 
find . -maxdepth ${depth} -type f -print0 | rsync -a --files-from=- --from0 ./ "${target}/" 

Antwort

20

rsync übertragen Dateien so schnell wie möglich über das Netzwerk. Versuchen Sie zum Beispiel, eine große Datei zu kopieren, die gar nicht am Ziel vorhanden ist. Diese Geschwindigkeit ist die maximale Geschwindigkeit, mit der rsync Daten übertragen kann. Vergleichen Sie es mit der Geschwindigkeit von scp (zum Beispiel). rsync ist bei der Raw-Übertragung noch langsamer, wenn die Zieldatei existiert, da beide Seiten einen wechselseitigen Chat darüber haben müssen, welche Teile der Datei geändert werden, aber sich durch die Identifizierung von Daten, die nicht übertragen werden müssen, amortisiert.

Eine einfachere Möglichkeit rsync parallel zu betreiben wäre parallel. Der nachfolgende Befehl würde parallel zu 5 rsync s laufen, wobei jeder ein Verzeichnis kopiert. Seien Sie sich bewusst, dass der Engpass möglicherweise nicht Ihr Netzwerk ist, aber die Geschwindigkeit Ihrer CPUs und Festplatten und das parallele Ausführen von Daten macht sie alle langsamer und nicht schneller.

run_rsync() { 
    # e.g. copies /main/files/blah to /main/filesTest/blah 
    rsync -av "$1" "/main/filesTest/${1#/main/files/}" 
} 
export -f run_rsync 
parallel -j5 run_rsync ::: /main/files/* 
+0

Nur versucht, dies und konnte dies auch nicht funktionieren. 'ls -1/main/Dateien/* | xargs -i -n5 rsync -av {}/main/filesTest/{} 'gab mir eine Menge von solchen Datei- oder Verzeichnisfehlern von rsync. Wie würde ich nur den rsync-Befehl ausdrucken, anstatt ihn auszuführen, damit ich sehen kann, was falsch läuft? – BT643

+0

Sie könnten es von 'rsync' zu' echo rsync' ändern –

+0

Ah, sorry, 'xargs' ist nicht richtig, es sollte' parallel' sein. Ich habe die Antwort aktualisiert. –

27

Dies scheint einfacher:

ls /srv/mail | parallel -v -j8 rsync -raz --progress {} myserver.com:/srv/mail/{} 
+4

Hinweis: Wenn Sie Ihre 'ls'-Ausgabe auf verschiedene Weise anpassen, z. B. die' LISTFLAGS '-Variable oder' DIR_COLORS'-Datei, müssen Sie 'ls --indicator-style = none' verwenden, um zu verhindern, dass' ls' angehängt wird Symbole für den Pfadnamen (z. B. '*' für ausführbare Dateien). – chadrik

+2

Ich fand das funktionierte viel besser, wenn ich cd/sourcedir verwendete; parallel -j8 -i rsync -aqH {}/destdir/{} - * – Criggie

7

Es gibt eine Reihe von alternativen Werkzeugen und Ansätze für diese rund um die Bahn aufgelistet tun. Zum Beispiel:

  • Die NCSA Blog hat eine Beschreibung von xargs und find mit rsync parallelisieren, ohne eine neue Software für die meisten * nix-Systemen zu installieren.

  • Und parsync bietet eine funktionsreiche Perl-Wrapper für parallele rync.

+2

Bitte posten Sie nicht einfach ein Werkzeug oder eine Bibliothek als Antwort. Zeigen Sie zumindest, wie das Problem gelöst wird (http://meta.stackoverflow.com/a/251605), in der Antwort selbst. –

+0

@i_m_mahii Stack Exchange sollte automatisch eine Kopie der verknüpften Seiten behalten. –

1

Ich habe ein Python-Paket entwickelt, genannt: parallel_sync

https://pythonhosted.org/parallel_sync/pages/examples.html

Hier ist ein Beispielcode, wie es zu benutzen:

from parallel_sync import rsync 
creds = {'user': 'myusername', 'key':'~/.ssh/id_rsa', 'host':'192.168.16.31'} 
rsync.upload('/tmp/local_dir', '/tmp/remote_dir', creds=creds) 

Parallelität ist standardmäßig 10; Sie können es erhöhen:

from parallel_sync import rsync 
creds = {'user': 'myusername', 'key':'~/.ssh/id_rsa', 'host':'192.168.16.31'} 
rsync.upload('/tmp/local_dir', '/tmp/remote_dir', creds=creds, parallelism=20) 

jedoch beachten, dass ssh typischerweise die MaxSessions von Standardsatz auf 10, so dass es über 10 zu erhöhen, werden Sie Ihre ssh-Einstellungen ändern müssen.

4

Sie können xargs verwenden, die das Ausführen vieler Prozesse gleichzeitig unterstützt. Für Ihren Fall wird es sein:

ls -1 /main/files | xargs -I {} -P 5 -n 1 rsync -avh /main/files/{} /main/filesTest/