Nous devons transférer 15TB
de données d'un serveur à l'autre aussi vite que possible. Nous utilisons actuellement rsync
mais nous obtenons seulement des vitesses autour de 150Mb/s
, quand notre réseau est capable de 900+Mb/s
(testé avec iperf
). J'ai fait des tests sur les disques, le réseau, etc. et je me suis dit que rsync ne transférait qu'un seul fichier à la fois, ce qui causait le ralentissement.Accélérer rsync avec des transferts de fichiers simultanés/simultanés?
J'ai trouvé un script pour exécuter un rsync différent pour chaque dossier dans une arborescence de répertoires (vous permettant de limiter à x nombre), mais je n'arrive pas à le faire fonctionner, il exécute encore un rsync à la fois.
J'ai trouvé le script
here (copié ci-dessous).
Notre arborescence est comme ceci:
/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
Donc ce que je voudrais arriver est de créer un rsync pour chacun des répertoires/main/fichiers, jusqu'à un maximum de, disons, 5 à la fois. Donc dans ce cas, 3 rsyncs fonctionnerait, pour /main/files/1
, /main/files/2
et /main/files/3
.
J'ai essayé avec elle comme ça, mais il fonctionne seulement 1 rsync à la fois pour le dossier /main/files/2
:
#!/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}/"
Juste essayé ceci et n'a pas pu obtenir ceci pour fonctionner non plus. 'ls -1/main/fichiers/* | xargs -i -n5 rsync -av {}/main/filesTest/{} 'vient de me donner une tonne de telles erreurs de fichier ou de répertoire de rsync. Comment est-ce que je pourrais simplement imprimer la commande rsync au lieu de l'exécuter pour que je puisse voir ce qui ne va pas? – BT643
Vous pouvez le changer de 'rsync' à' echo rsync' –
Ah, désolé, 'xargs' n'est pas correct, il devrait être' parallel'. J'ai mis à jour la réponse. –