Accélérer rsync avec traduction Simultanée/Simultanées Transferts de Fichiers?
Nous avons besoin de transférer 15TB
de données d'un serveur à l'autre aussi vite que nous le pouvons. Nous sommes actuellement en utilisant rsync
mais nous sommes seulement à obtenir des vitesses autour de 150Mb/s
, lors de notre réseau est capable de 900+Mb/s
(testé avec iperf
). J'ai fait des tests de disques, réseau, etc ... et pensé que c'est juste que rsync est seulement le transfert d'un fichier à un moment qui est à l'origine du ralentissement.
J'ai trouvé un script à exécuter un autre rsync pour chaque dossier dans l'arborescence des répertoires (vous permettant de limiter à un nombre x), mais je ne peux pas le faire fonctionner, il reste juste exécute un rsync à la fois.
J'ai trouvé le script
ici (copié ci-dessous).
Notre arborescence de répertoire 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 dans /main/fichiers, jusqu'à un maximum de, disons, 5 à la fois. Donc dans ce cas, 3 rsyncs irait, pour /main/files/1
, /main/files/2
et /main/files/3
.
J'ai essayé avec elle comme ça, mais il va juste 1 rsync à la fois pour la /main/files/2
dossier:
#!/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 's@^\./@@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}/"
Vous devez vous connecter pour publier un commentaire.
Cela semble plus simple:
ls
de sortie par le biais de divers moyens, tels que laLISTFLAGS
variable ouDIR_COLORS
fichier, vous devrez peut-être utiliserls --indicator-style=none
pour éviterls
de ajoutant des symboles pour le nom de chemin d'accès (comme*
pour les fichiers exécutables).ls
commande avant.man parallel
devraient avoir plus de détails. Lefind
commande utilise le même je crois.rsync
transferts de fichiers le plus vite possible sur le réseau. Par exemple, essayez de l'utiliser pour copier un gros fichier qui n'existe pas du tout sur la destination. Cette vitesse est la vitesse maximale rsync permet de transférer des données. Comparer avec la vitesse descp
(par exemple).rsync
est encore plus lente à raw transfert lorsque le fichier de destination existe, parce que les deux côtés ont un chat à propos de ce que les parties du fichier est modifié, mais paie pour lui-même par l'identification des données qui n'ont pas besoin d'être transférés.Un moyen plus simple pour exécuter
rsync
en parallèle serait d'utiliserparallèle
. La commande ci-dessous irait jusqu'à 5rsync
s en parallèle, chaque copie d'un répertoire. Sachez que le goulot d'étranglement peut-être pas votre réseau, mais la vitesse de votre Cpu et les disques, et les choses en cours d'exécution en parallèle, juste qui rend le tout plus lentement, pas plus rapide.ls -1 /main/files/* | xargs -i -n5 rsync -av {} /main/filesTest/{}
m'a donné une tonne de aucun fichier ou répertoire des erreurs de rsync. Comment aurais-je simplement imprimer la commande rsync au lieu de le lancer pour que je puisse voir ce qui ne va pas?rsync
àecho rsync
xargs
n'est pas droit, il doit êtreparallel
. J'ai mis à jour la réponse.apt-get install parallel
. N'a pas vraiment envie de commencer à installer des trucs manuellement juste pour cette raison il est très rarement nécessaire. J'espérais juste pour un script vite que je pouvais faire avec.apt-get install moreutils
pour installerparallel
apt-get install moreutils
parallel
, il convient de noter que lamoreutils
package installe un binaires différents avec le même nom. Les deux accepter les arguments donnés dans cette réponse, mais la version GNU doit être installé avecapt-get install parallel
si vous êtes à la lecture de la documentation GNU.Vous pouvez utiliser
xargs
qui prend en charge l'exécution de plusieurs processus à la fois. Pour votre cas, ce sera:Il y a un certain nombre d'autres outils et approches pour faire ce répertoriés dans le web. Par exemple:
La NCSA Blog a une description de l'utilisation
xargs
etfind
pour paralléliser rsync sans avoir à installer de nouveaux logiciels pour la plupart des systèmes *nix.Et parsync fournit une fonctionnalité riche Perl wrapper pour parallèle rsync.
J'ai développé un paquet python appelé: parallel_sync
https://pythonhosted.org/parallel_sync/pages/examples.html
Voici un exemple de code comment l'utiliser:
parallélisme par défaut est de 10; vous pouvez l'augmenter:
cependant noter que ssh a généralement le MaxSessions par défaut est défini sur 10, de sorte à augmenter au-delà de 10, vous devrez modifier votre ssh paramètres.
Le plus simple que j'ai trouvé est à l'aide de tâches en arrière-plan dans le shell:
Attention, il ne limite pas le montant des travaux! Si vous êtes liées au réseau ce n'est pas vraiment un problème, mais si vous êtes en attente pour la filature de la rouille, ce sera l'écroulement du disque.
Vous pouvez ajouter
à l'intérieur de la boucle pour une forme primitive de contrôle des tâches.