web-dev-qa-db-fra.com

Déplacement de 2 To (10 militaires + DIRS), quel est mon goulot d'étranglement?

Fond

I a manqué d'espace sur /home/data Et devez transférer /home/data/repo Sur /home/data2.

/home/data/repo Contient des DIRS de 1M, chacun contenant 11 DIRS et 10 fichiers. Il totalise 2 To.

/home/data Est sur EXT3 avec DIR_IDEX activé. /home/data2 Est sur ext4. Centos de course 6.4.

Je suppose que ces approches sont lentes en raison du fait que repo/ Comporte 1 million d'adultes directement sous elle.


Tentative 1: mv est rapide mais est interrompu

Je pourrais être fait si cela avait fini:

/home/data> mv repo ../data2

Mais il a été interrompu après que 1,5 To a été transféré. Il écrivait à environ 1 Go/min.

Tentative 2: rsync rampe après 8 heures de liste de fichiers de construction

/home/data> rsync --ignore-existing -rv repo ../data2

Il a fallu plusieurs heures pour construire la "liste de fichiers incrémentiels", puis il transfère à 100 Mo/min.

Je l'annule pour essayer une approche plus rapide.

Tentative 3a: mv se plaint

Testez-le sur un sous-répertoire:

/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory

Je ne suis pas sûr de quoi il s'agit d'erreur, mais peut-être que cp peut me renfrogné ..

Tentative 3B: cp ne devient nulle part après 8 heures

/home/data> cp -nr repo ../data2

Il lit le disque pendant 8 heures et je décide de l'annuler et de revenir à rsync.

Tentative 4: rsync rampe après 8 heures de liste de fichiers de construction

/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2

J'ai utilisé --remove-source-files Je pense que cela pourrait le rendre plus rapide si je commence à nettoyer maintenant.

Il faut au moins 6 heures pour construire la liste des fichiers, puis elle transfère à 100-200 Mo/min.

Mais le serveur était chargé du jour au lendemain et ma connexion fermée.

Tentative 5: il ne reste que 300 Go à gauche pour déménager pourquoi IS ceci SO douloureux

/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2

Interrompu à nouveau. Le -W A presque semblé faire "Envoi de liste de fichiers incrémentiels" plus rapidement, ce qui, à ma compréhension, ne devrait pas avoir de sens. Peu importe, le transfert est horriblement lent et je renonce à celui-ci.

Tentative 6: tar

/home/data> Nohup tar cf - . |(cd ../data2; tar xvfk -)

Essentiellement tenter de tout recopier mais ignorer les fichiers existants. Il doit atterrir jusqu'au 1,7 To de fichiers existants, mais au moins il lit à 1,2 Go/min.

Jusqu'à présent, il s'agit de la seule commande qui donne une gratification instantanée.

Mise à jour: à nouveau interrompue, d'une manière ou d'une autre, même avec NOHUP ..

Tentative 7: Harakiri

Débattre toujours celui-ci

Tentative 8: "Fusion" script avec mv

Le directeur de destination avait environ 120 000 Dirts vides, alors j'ai couru

/home/data2/repo> find . -type d -empty -exec rmdir {} \;

Écran Ruby:

SRC  = "/home/data/repo"
DEST = "/home/data2/repo"

`ls #{SRC}  --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`

t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"

# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
  dir = line.strip.gsub('< ', '')
  puts `mv #{SRC}/#{dir} #{DEST}/`
end

DONE.

21
Tim

Avez-vous déjà entendu parler de fractionnement de grandes tâches dans des tâches plus petites?

/ Accueil/Data/Repos contient des DIRS de 1M, chacun contenant 11 DIRS et 10 fichiers. Il totalise 2 To.

rsync -a /source/1/ /destination/1/
rsync -a /source/2/ /destination/2/
rsync -a /source/3/ /destination/3/
rsync -a /source/4/ /destination/4/
rsync -a /source/5/ /destination/5/
rsync -a /source/6/ /destination/6/
rsync -a /source/7/ /destination/7/
rsync -a /source/8/ /destination/8/
rsync -a /source/9/ /destination/9/
rsync -a /source/10/ /destination/10/
rsync -a /source/11/ /destination/11/

(...)

Temps de pause café.

C'est ce qui se passe:

  • Initialement RSYNC construira la liste des fichiers.
  • Construire cette liste est vraiment lent, en raison d'un tri initial de la liste des fichiers.
  • Cela peut être évité à l'aide de LS -F -1 et de la combinaison avec Xargs pour la construction de l'ensemble des fichiers que RSYNC utilisera ou de rediriger une sortie dans un fichier avec la liste des fichiers.
  • Passer cette liste à RSYNC au lieu du dossier, rendra RSYNC pour commencer à travailler immédiatement.
  • Cette astuce de LS -F -1 sur des dossiers avec des millions de fichiers est parfaitement décrite dans cet article: http://unixetc.co.uk/2012/05/20/1arge-Directory-causes-ls-to -Hang /
4
maki

Même si rsync est lent (pourquoi est-ce lent? Peut-être -ez -ez -ez aidera) ça sonne comme si vous avez beaucoup progressé, vous pourriez donc continuer à essayer:

Si vous avez utilisé --ReMove-Source-Files, vous pouvez ensuite suivre en supprimant les répertoires vides. --ReMove-Source-Files supprimera tous les fichiers, mais laissera les répertoires là-bas.

Assurez-vous simplement que vous Ne pas Utilisez --ReMove-Source-Files avec -Delete pour effectuer plusieurs passes.

Aussi pour une vitesse accrue, vous pouvez utiliser --Enface

Si vous obtenez des coups de bottes parce que vous essayez de le faire à distance sur un serveur, allez-y et exécutez cela à l'intérieur d'une session d'écran. De cette façon, vous pouvez le laisser courir.

1
Angelo