Kann ich große Dateien schneller kopieren, ohne den Dateicache zu verwenden?


19

Nach dem Hinzufügen des preloadPakets scheinen sich meine Anwendungen zu beschleunigen. Wenn ich jedoch eine große Datei kopiere, vergrößert sich der Dateicache um mehr als das Doppelte der Dateigröße.

Durch das Übertragen eines einzelnen Abbilds oder einer Videodatei mit 3-4 GB auf ein externes Laufwerk werden scheinbar alle vorinstallierten Anwendungen aus dem Arbeitsspeicher entfernt, was zu längeren Ladezeiten und allgemeinen Leistungseinbußen führt.

Gibt es eine Möglichkeit, große Dateien mit mehreren Gigabyte zu kopieren, ohne sie zwischenzuspeichern (dh den Dateicache zu umgehen)? Oder eine Möglichkeit, bestimmte Ordner aus der Whitelist oder der Blacklist aus dem Cache zu entfernen?

Antworten:


19

Es gibt das nocacheDienstprogramm, das einem Befehl wie ioniceund vorangestellt werden kann nice. Es funktioniert, indem eine Bibliothek vorgeladen wird, posix_fadvisedie POSIX_FADV_DONTNEEDalle offenen Aufrufe mit dem Flag ergänzt .

In einfachen Worten, es rät der Kernel das Caching nicht für diese bestimmte Datei benötigt wird; Der Kernel speichert die Datei dann normalerweise nicht im Cache. Sehen Sie hier für die technischen Details.

Bei umfangreichen Kopieraufträgen ist dies ein Wunder. Wenn Sie beispielsweise eine Multi-Terabyte-Festplatte im Hintergrund sichern möchten, ohne dass sich dies auf Ihr laufendes System auswirkt, können Sie etwas tun nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Ein Paket wird ab Ubuntu 13.10 verfügbar sein. Wenn Sie mit einer früheren Version arbeiten, können Sie entweder das 13.10-Paket installieren oder sich für dieses 12.04-Backport von François Marier entscheiden.


Ich hatte gehofft, dass etwas über die grafische Benutzeroberfläche erledigt werden kann und dass die Ordner ohne Cache auf eine schwarze Liste gesetzt werden können, aber dies muss vorerst geschehen.
Veazer

12

Für einzelne große Dateien, Verwendung ddmit direktem E / A - Bypass - Dateicache:

Wenn Sie eine (oder mehrere) große Multi-Gigabyte-Dateien übertragen möchten, ist dies ganz einfach dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • Die directFlags teilen ddmit, dass O_DIRECTbeim Lesen und Schreiben die direkte E / A-Option ( ) des Kernels verwendet werden soll , wodurch der Dateicache vollständig umgangen wird.
  • Die bsOption blocksize muss auf einen relativ großen Wert gesetzt werden, da zur Minimierung der Anzahl der Vorgänge auf der physischen Festplatte ddkeine Lese- / Schreibvorgänge mehr zwischengespeichert werden müssen und zu viele kleine direkte Vorgänge zu einer ernsthaften Verlangsamung führen können.
    • Sie können gerne mit Werten zwischen 1 und 32 MB experimentieren. Die Einstellung oben ist 4 MB ( 4M).

Für mehrfache / rekursive Verzeichniskopien gibt es leider keine leicht verfügbaren Tools. die üblichen cpusw. unterstützen keine direkten I / O.

/ e iflags & oflags wurden in das richtige iflag & oflag geändert


1
Rekursiv könnte mit zshdem **Operator von erfolgen. zshmuss manuell von den Repos installiert werden.
Wiedereinsetzung von Monica - ζ--

1
Nicht wirklich. dd's seltsame Syntax verdirbt den ** oprtator. Sie könnten noch einen Shell - Skript verwenden , die Argumente normalerweise bekam ( dd.sh in.file out.filemit ** in den Dateinamen) und gab die Dateinamen zu ddverwenden $1, $2usw., die nicht von DDs seltsamen Syntax verschmutzt werden soll.
Wiedereinstellung von Monica - ζ--

1
Direct make ist sehr langsam, da es AFAIK auch die Readahead-Caches deaktiviert, was wahrscheinlich nicht das ist, was Sie wollen, und auch in einem Benchmarking-Szenario nicht realistisch ist. Verwenden Sie stattdessen "iflag = nocache oflag = nocache", was dem Betriebssystem genau sagt, dass Sie die zwischengespeicherte In-Datei oder Out-Datei nicht benötigen.
Stolsvik

1

Sie können ein Verzeichnis rekursiv kopieren mit ddVerwendung findundmkdir

Wir müssen zwei Probleme umgehen:

  1. dd weiß nicht, was mit Verzeichnissen zu tun ist
  2. dd kann jeweils nur eine Datei kopieren

Definieren wir zuerst die Eingabe- und Ausgabeverzeichnisse:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Lassen Sie uns nun cdin das Quellverzeichnis findgehen, um relative Verzeichnisse zu melden, die wir leicht bearbeiten können:

cd "$SOURCE"

Duplizieren Sie den Verzeichnisbaum von $SOURCEbis$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

Dupliziere Dateien von $SOURCE, $TARGETum den Schreibcache wegzulassen (aber benutze den Lesecache!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Beachten Sie, dass dadurch die Änderungszeiten, der Besitz und andere Attribute der Datei nicht erhalten bleiben.

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.