Wie kann ich den Ressourcenverbrauch beim Kopieren einer großen Datei reduzieren?

8

Ich muss eine große Datei (beschädigte MySQL-Tabelle ~ 40 GB) auf einen separaten Server verschieben, um sie zu reparieren. (Beim Versuch, auf meinem Produktionsserver zu reparieren, wurde der Server schnell beendet.)

Zu diesem Zweck möchte ich die Dateien .frm, .MYI und .MYD von meinem Produktionsserver auf einen Cloud-Server synchronisieren.

Ich kopiere die Dateien von / var / lib / mysql / {database} / nach / home / {myuser}, damit ich den Root-Zugriff für den Befehl rsync nicht aktivieren und 100% sicher sein muss, dass die Datenbankdatei nicht vorhanden ist in Verwendung (es sollte nicht beschrieben oder gelesen werden, aber ich möchte meine Produktionsdatenbank natürlich nicht herunterfahren, um sicherzugehen).

Die erste Datei, die ich zu kopieren versuchte, war ungefähr 10 GB groß. Ich übertrage von einem Teil meines Produktionsservers auf den anderen, dh auf dasselbe Festplattenarray.

Leider hat der Kopierbefehl "cp filename newfilename" so viele Ressourcen beansprucht, dass der Server zum Stillstand kam.

Wie kann ich weniger Ressourcen verwenden, wenn ich die Datei in ein anderes Verzeichnis kopiere? (Es ist nicht wirklich wichtig, wie lange es dauert).

Angenommen, ich schaffe dies. Welche Ressourcennutzung kann ich dann erwarten, wenn ich die Datei mit der Cloud synchronisiere?

Kann jemand einen besseren Weg vorschlagen, dies zu tun? Mir geht schnell der Speicherplatz aus, daher muss diese Tabelle so schnell wie möglich repariert und archiviert werden.

Jon M.
quelle

Antworten:

5

Haben Sie versucht nice -n10, dem Befehl ein Präfix voranzustellen?

10ist der Standardwert. Der Bereich reicht von -20(höchste Priorität) bis 19(niedrigste).

Jonathan Ross
quelle
@ Jonathan Mein Verständnis ist, dass dies nur die CPU-Auslastung begrenzt, nicht Festplatten-E / A und RAM: linux.com/archive/feed/58638
Jon M
Ja, aber es ist ein Anfang, um einen der Engpässe zu verringern - es könnte ausreichen, um das Hängen der Maschine zu stoppen.
Jonathan Ross
Vielen Dank an Jonathan Ross: linux.die.net/man/1/ionice "Programme erben die CPU-Einstellung für io-Prioritäten.", So dass es vielleicht funktioniert, aber ich recherchiere eine Kombination aus "nett" und "ionice"
Jon M
Gute Idee. Ich habe immer nicemeistens aus Gewohnheit angefangen. iotopist auch dein Freund.
Jonathan Ross
3
Der letzte Befehl, den ich nice -n 20 ionice -c 3 cp /var/lib/mysql/{database}/{table}.MYI /home/{USER}/ausführte, war: Dies hat die Auslastung meines Servers etwas verlangsamt, aber die Website war für die Dauer der Übertragung verfügbar
Jon M
10

Neben der rsync-Bandbreitenbeschränkung gibt es zwei Möglichkeiten:

  • ionice -c 3 cp foo bar
  • buffer -u 150 -m 16m -s 100m -p 75 -i foo -o bar

ionicewird mit dem E / A-Scheduler verbunden. bufferist ein kreisförmiger Puffer, der Zeichengeräten dabei helfen soll, effizienter zu sein, aber -u 150zwischen den Schreibvorgängen wird eine Pause von 150 Mikrosekunden eingelegt, was laut Handbuch ausreichen kann, um einem Festplattenraum zum Atmen zu geben.

Beide ioniceund buffersind in einem Ubuntu-Build erhältlich. iotopist praktisch, wenn Sie CONFIG_TASK_DELAY_ACCT in Ihrem Kernel konfiguriert haben, meine Ubuntu-Box dies jedoch nicht getan hat, was die Benutzerfreundlichkeit des Befehls stark einschränkt. Ich weiß bereits, welcher Befehl meine Festplatte übertönt, ich möchte ihr nur etwas Luft zum Atmen geben.

Überprüfen Sie während des Kopiervorgangs die Ausgabe von iostat -x 1(normalerweise im sysstat-Paket) und stellen Sie fest, dass das Feld% Busy für Ihr Gerät während des Kopiervorgangs 90% oder weniger beträgt. Wenn es bei 99-100% liegt, hungern Sie nach anderen Prozessen für E / A.

Zerolagtime
quelle
Vielen Dank für Ihre Antwort @zerolagtime Ich habe am Ende einen ähnlichen ionice-Befehl verwendet, aber die frühere Antwort als richtig markiert
Jon M
ionice -c 3 -p $pidUnisonarbeitet unisono auf externer Festplatte, danke !!
Wassermann Power
6

Verwenden Sie rsync mit dem Schalter --bwlimit = KBPS (E / A-Bandbreite begrenzen; KByte pro Sekunde). Spielen Sie mit einer kleineren Datei herum und versuchen Sie, eine optimale Mischung zwischen Übertragungsgeschwindigkeit und Systemnutzung zu finden. Monitor in der zweiten Shell mit "vmstat 1"

Shakalandy
quelle
Ich werde dies sicherlich versuchen, um die Ressourcen des RSYNC-Befehls zu begrenzen, aber im Moment versuche ich nur, eine Datei über den Befehl "cp" an einen anderen Speicherort auf meinem Server zu kopieren.
Jon M
Sie können auch rsync verwenden, um die lokale Datei zu kopieren und die Bandbreite mit dem Schalter --bwlimit zu begrenzen.
Shakalandy
rsynckopiert Dateien lokal. Denken Sie nach rsync --bwlimit=28000 foo.frm /bar/foo.frmund schauen Sie es sich dann an iostat. Ich bin mir nicht sicher, warum vmstatich es Ihnen sagen würde, wenn Sie ein Laufwerk sättigen würden. Suchen Sie nach% beschäftigt in iostat.
Zerolagtime
Nun, vmstat zeigt Ihre E / A auf Blockgeräten. Darüber hinaus können Sie alles andere sehen, was für die Maschinennutzung wichtig ist (CPU, Benutzerprozesse, CPU-Wartezeit, Austausch, ...)
Shakalandy
0

Eine Alternative ist:

scp -l ${KBPS} ${src} ${dest}

Aber ich glaube nicht, dass es funktionieren wird, wenn $ {src} eine wachsende Datei ist ... können Sie eine Möglichkeit vorschlagen, die Quelle zu kopieren und darauf zu warten, dass sie geschlossen wird ...

rzr
quelle