Wie kann der Schreibpuffer von Linux für Wechselmedien reduziert werden?

8

Beim Schreiben von Inhalten auf Wechselmedien unter Linux (USB-Sticks / Festplatten, SD-Karten usw.) sehe ich oft unglaubliche Schreibgeschwindigkeiten in den ersten Sekunden, manchmal in der Größenordnung von GB / s (Füllen des Schreibpuffers), gefolgt von mehreren Minuten Ruhe (Puffer wird tatsächlich auf das Gerät geschrieben).

Es ist irreführend. Es macht es schwierig, die tatsächliche Schreibgeschwindigkeit zu beurteilen. Es ist ärgerlich (kann ein Programm nicht unterbrechen, während es Puffer leert). Dies kann FS-Schäden und zumindest ungeschriebenen Inhalt verursachen, wenn das Gerät vom Netz getrennt wird, während es noch geschrieben wird.

Der Schreibpuffer scheint in meinem Fall über einem GB zu liegen. Gibt es eine Möglichkeit, dies zu kontrollieren? Ich möchte es auf einen vernünftigeren Wert reduzieren.

Hinweis: Hierbei handelt es sich nicht um den Dateisystem-Cache. Dieser Effekt tritt auch auf RAW-Geräten auf

Hinweis: Ich möchte Schreibpuffer nicht vollständig deaktivieren

Vielen Dank!

1N4001
quelle
1
Ziehen Sie niemals den Stecker aus der Steckdose, ohne umountein fs zu verwenden (verwenden Sie in der GUI die Schaltfläche 'Auswerfen' am gemounteten fs-Knoten in der vom Dateimanager angezeigten Baumstruktur). Das umountschließt alle ausstehenden E / A-Vorgänge effektiv ab und spült alle ausstehenden Fs-Cashes.
Serge
(und wenn Sie das Gerät direkt schreiben, z. B. mit dd, müssen Sie sicherstellen, dass Sie etwas wie verwenden, syncbevor Sie das Gerät entfernen)
sourcejedi

Antworten:

4

Ich habe die Antwort gefunden. 64-Bit-Linux verwaltet standardmäßig einen großen Schreibpuffer (20% des verfügbaren Speichers!). (Interessanterweise beschränkt sich 32-Bit-Linux auf höchstens 180 MB.) Um die Größe des Dirty-Puffers auf z. B. 200 MB zu ändern, kann man verwenden

echo 200000000 > /proc/sys/vm/dirty_bytes

ODER um einen Prozentsatz des Arbeitsspeichers zu verwenden, z. B. 1%:

echo 1 > /proc/sys/vm/dirty_ratio

Weitere Informationen: https://lwn.net/Articles/572911/

1N4001
quelle
1
Sowohl 32-Bit- als auch 64-Bit-Linux-Kernel verwenden die Standardeinstellung dirty_ratio20. Der 32-Bit-Kernel verfügt jedoch aufgrund der Beschränkungen der 32-Bit-x86-Architektur über ein maximal verfügbares Kernel-RAM-Limit von 1 GB. Infolgedessen beträgt die maximale Standardgröße für den Schreibcache auf einem 32-Bit-System je nach Hardware etwa 180 bis 200 MB (mindestens PCI-Geräte mit DMA-Zugriff reduzieren das nutzbare RAM-Limit).
Mikko Rantalainen
Dies ist jedoch nicht die vollständige Antwort auf Ihre ursprüngliche Frage. Ich möchte meinen externen langsamen Speicher drosseln, nicht meinen internen schnellen Speicher ...
Pipe