Wenn ich 2 TB (10 Mio. Dateien + Verzeichnisse) verschiebe, was ist mein Engpass?


21

Hintergrund

Ich lief aus dem Raum auf /home/dataund Notwendigkeit der Übertragung /home/data/repoan /home/data2.

/home/data/repoenthält 1M Verzeichnisse, von denen jedes 11 Verzeichnisse und 10 Dateien enthält. Es beläuft sich auf 2 TB.

/home/dataist auf ext3 mit dir_index aktiviert. /home/data2ist auf ext4. Ausführen von CentOS 6.4.

Ich repo/gehe davon aus, dass diese Ansätze langsam sind, da 1 Million Verzeichnisse direkt darunter liegen.


Versuch 1: mvist schnell, wird aber unterbrochen

Ich könnte fertig sein, wenn dies beendet wäre:

/home/data> mv repo ../data2

Aber es wurde unterbrochen, nachdem 1,5 TB übertragen wurden. Es wurde mit ca. 1GB / min geschrieben.

Versuch 2: rsyncCrawlt nach 8 Stunden Erstellen der Dateiliste

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

Das Erstellen der inkrementellen Dateiliste dauerte mehrere Stunden und die Übertragung erfolgte mit 100 MB / min.

Ich storniere es, um einen schnelleren Ansatz zu versuchen.

Versuch 3a: mvbeschwert sich

Testen Sie es in einem Unterverzeichnis:

/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

Ich bin mir nicht sicher, worum es bei diesem Fehler geht, aber vielleicht cpkann ich mich retten.

Versuch 3b: cpkommt nach 8 Stunden nirgendwo hin

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

Der Datenträger wird 8 Stunden lang gelesen, und ich beschließe, ihn abzubrechen und zu rsync zurückzukehren.

Versuch 4: rsyncCrawlt nach 8 Stunden Erstellen der Dateiliste

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

Ich --remove-source-filesdachte, es könnte schneller gehen, wenn ich jetzt mit dem Aufräumen beginne.

Es dauert mindestens 6 Stunden, um die Dateiliste zu erstellen, und anschließend werden Daten mit einer Geschwindigkeit von 100-200 MB / min übertragen.

Aber der Server wurde über Nacht belastet und meine Verbindung geschlossen.

Versuch 5: Es sind nur noch 300 GB übrig, um sich zu bewegen, warum dies so schmerzhaft ist

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

Wieder unterbrochen. Das -Wschien das "Versenden inkrementeller Dateilisten" fast zu beschleunigen, was meines Erachtens keinen Sinn ergeben sollte. Ungeachtet dessen ist die Übertragung schrecklich langsam und ich gebe diese auf.

Versuch 6: tar

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

Grundsätzlich wird versucht, alles neu zu kopieren, aber vorhandene Dateien werden ignoriert. Es muss 1,7 TB der vorhandenen Dateien durchwühlen, liest jedoch mindestens mit 1,2 GB / min.

Bisher ist dies der einzige Befehl, der sofortige Befriedigung gibt.

Update: wieder irgendwie unterbrochen, auch mit nohup ..

Versuch 7: Harakiri

Debattiere immer noch darüber

Versuch 8: Zusammenführen mit Skript mv

Das Zielverzeichnis hatte ungefähr 120.000 leere Verzeichnisse, also bin ich gelaufen

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

Ruby-Skript:

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

GETAN.


Sie haben Recht, es muss jedes Verzeichnis finden und auflisten, und 1 Million Verzeichnisse werden schmerzhaft sein.
Cybernard

2
Schauen Sie sich das Gute an ... Wenn es Windows wäre, könnten Sie nicht einmal eine Million Unterverzeichnisse haben und trotzdem ein Betriebssystem, das funktioniert. :)
Jack

1
@ Tim, warum gehst du nicht einfach mvnochmal? Theoretisch mvwird eine Quelldatei nur gelöscht, wenn die Zieldatei vollständig kopiert wurde, sodass sie ordnungsgemäß funktionieren sollte . Haben Sie auch physischen Zugriff auf das Gerät oder erfolgt dies über eine sshVerbindung?
Terdon

5
Nein, das kann es nicht. mvist nicht verzeihend, wenn Sie immer wieder getrennt werden, können Sie Daten verlieren und wissen es nicht einmal. Wie Sie sagten, Sie tun dies über ssh, empfehle ich mit screenund trennen. Aktivieren Sie die Protokollierung und verfolgen Sie diese. Wenn Sie ausführlich sprechen, dauert es nur länger. Versuchen Sie auchiotop
justbrowsing

2
@justbrowsing - Guter Anruf auf screen. Ich habe mich über Verbose gewundert, aber ich denke, es ist zu spät, um tarjetzt neu zu starten . Und iotopwar in den letzten Tagen mein Lieblingsdienstprogramm :)
Tim

Antworten:


6

Schon einmal davon gehört, große Aufgaben in kleinere Aufgaben aufzuteilen?

/ home / data / repo enthält 1 Million Verzeichnisse, von denen jedes 11 Verzeichnisse und 10 Dateien enthält. Es beläuft sich auf 2 TB.

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/

(...)

Kaffeepause.


1
Der Vorteil, den ich vage hervorhebe, ist, dass Sie den Fortschritt in kleinen Teilen manuell verfolgen, so dass die Wiederaufnahme der Aufgabe weniger Zeit in Anspruch nimmt, wenn ein Teil abgebrochen wird (weil Sie wissen, welche Schritte erfolgreich abgeschlossen wurden).
Ярослав Рахматуллин

Dies ist im Grunde das, was ich am Ende getan habe, außer mit mv. Leider gibt es keine Werkzeugsitzung mvund auf rsynchalbem Weg.
Tim

4

Folgendes passiert gerade:

  • Zunächst erstellt rsync die Liste der Dateien.
  • Das Erstellen dieser Liste ist aufgrund der anfänglichen Sortierung der Dateiliste sehr langsam.
  • Dies kann vermieden werden, indem Sie ls -f -1 verwenden und mit xargs kombinieren, um die von rsync zu verwendenden Dateigruppen zu erstellen, oder die Ausgabe in eine Datei mit der Dateiliste umleiten.
  • Wenn Sie diese Liste anstelle des Ordners an rsync übergeben, wird rsync sofort gestartet.
  • Dieser Trick von ls -f -1 über Ordner mit Millionen von Dateien wird in diesem Artikel perfekt beschrieben: http://unixetc.co.uk/2012/05/20/large-directory-causes-ls-to-hang/

1
Können Sie ein Beispiel für die Verwendung von ls mit rsync geben? Ich habe eine ähnliche, aber nicht identische Situation. Auf Computer AI wird rsyncd ausgeführt, und ich möchte einen großen Verzeichnisbaum auf Computer B übertragen (90% des Verzeichnisses befinden sich bereits auf B). Das Problem ist, dass ich dazu eine instabile mobile Verbindung verwenden muss, die häufig unterbrochen wird. Es ist ziemlich ineffizient, bei jedem Neustart eine Stunde für die Erstellung der Dateiliste aufzuwenden. Außerdem befindet sich B hinter NAT, das ich nicht kontrolliere, sodass es schwierig ist, A -> B zu verbinden, während B -> A einfach ist.
15.

Stimmen Sie mit @db überein. Wenn ein Beispiel gegeben werden könnte, wäre diese Antwort viel nützlicher.
Redfox05

1

Selbst wenn rsync langsam ist (warum ist es langsam? Vielleicht hilft -z), hört es sich so an, als ob Sie eine Menge davon verschoben haben, also könnten Sie einfach weiter versuchen:

Wenn Sie --remove-source-files verwendet haben, können Sie anschließend leere Verzeichnisse entfernen. --remove-source-files entfernt alle Dateien, belässt aber die Verzeichnisse dort.

Stellen Sie einfach sicher, dass Sie --remove-source-files NICHT mit --delete verwenden, um mehrere Durchläufe durchzuführen.

Auch für eine höhere Geschwindigkeit können Sie --inplace verwenden

Wenn Sie rausgeschmissen werden, weil Sie dies remote auf einem Server versuchen, führen Sie dies in einer "Bildschirm" -Sitzung aus. Zumindest so kann man es laufen lassen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.