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 script
here (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}/"
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
Sie könnten es von 'rsync' zu' echo rsync' ändern –
Ah, sorry, 'xargs' ist nicht richtig, es sollte' parallel' sein. Ich habe die Antwort aktualisiert. –