Passen Sie die Linux-Festplattenspülintervalle an, um das Blockieren der Benutzerprozesse zu vermeiden

2434
patraulea

Ich lade Dateien von einer SD-Karte herunter, die auf einem Himbeer-Pi mit rtorrent installiert ist, mit etwa 6 MB / s (Bandbreitenbegrenzung). Der Benutzerprozess leert die Daten nicht selbst. Das Intervall, in dem der Plattencache geleert wird, hängt von den sysctl-Werten ab.

Mit iostat und nload kann ich die Netzwerkbandbreite und die Festplattenschreibprofile sehen:

Platte:

20M/s .....x.....x....xx... .....x....xx....xx... ....xx....xx....xx... 0M/s ....xx....xx....xx... 

Netzwerk:

5M/s ..xxx....x.. x.....x. .xxxx...xx..xxx...xxx 0M/s xxxxx...xxx.xxx...xxx 

Anscheinend ist der IO-Schreiber während des Spülens immer pausiert. Es handelt sich um eine 4-Kern-CPU mit 3 Kernen, die ständig im Leerlauf sind, und Top sagt 100% Iowait während des Spülens aus.

Wenn ich das while true; do sync; sleep 1; donewährend des Herunterladens mache, ist die Festplattenspülung bei 6 MB pro Sekunde glatt. Der Downloader-Prozess wird nicht blockiert, sodass die Bandbreite konstant bleibt.

Ich kann den gleichen Effekt erzielen mit:

/proc/sys/vm/dirty_writeback_centisecs: wie oft das Löschen des Datenträger-Caches innerhalb von 100 Sekunden erfolgt; Standardeinstellung: 500

und /proc/sys/vm/dirty_expire_centisecs: wie alt eine Seite sein muss, um in 100 Sekunden gespült zu werden; Standardeinstellung: 3000

Wenn Sie diese Werte auf 100 bzw. 200 einstellen, werden das gleiche gerade Flush-Profil und die konstante Download-Bandbreite erreicht.

Gibt es eine Möglichkeit, diese Abstimmung automatisch durchzuführen, dh so oft wie möglich zu spülen, um den Schreibvorgang nicht blockieren zu müssen? Wenn zum Beispiel die Download-Geschwindigkeit 1 MB / s beträgt, reicht es wahrscheinlich aus, alle 5 Sekunden zu leeren.

5

1 Antwort auf die Frage

4
Ludovic Ronsin

Der Linux-Kernel prüft alle, dirty_writeback_centisecsob ältere Seiten älter als Dirty sind dirty_expire_centisecs. Mit Ihren Standardeinstellungen wird alle 5 Sekunden nach verschmutzten Seiten gesucht, die älter als 30 Sekunden sind.

Der Kernel hat auch ein Dirty-Memory-Limit. Wenn dieser Grenzwert erreicht ist, werden alle Schreibvorgänge blockiert, um zu vermeiden, dass zu viele schmutzige Seiten im RAM gespeichert werden.

Was Sie tun sollten, ist

  • vm.dirty_background_ratio : Die Menge des Systemspeichers, die mit verschmutzten Seiten gefüllt werden kann, bevor der Kernel im Hintergrund auf Festplatte brennt.
  • vm.dirty_ratio: Der maximale Systemspeicher, der mit fehlerhaften Seiten gefüllt werden kann. Dann blockiert der Kernel alle E / A-Anforderungen, bis alles auf die Festplatte geschrieben ist.

Um dieses Verhalten nicht zu erhalten, müssen Sie dem Kernel mitteilen, dass er mindestens 30s * 6MB / s = 180MB enthalten sollte. Sie müssen auch die langsame Schreibgeschwindigkeit des Raspberry Pi berücksichtigen, da während der Zeit, die zum Spülen auf die Festplatte benötigt wird, mehr fehlerhafte Seiten in den Arbeitsspeicher geschrieben werden.

Dies kann zu viel RAM für den Raspberry Pi bedeuten, daher müssen Sie möglicherweise den Arbeitsspeicher senken dirty_expire_centisecs. Beachten Sie, dass die Verwendung von kleinen Werten die Reaktionsfähigkeit des Systems beeinträchtigen kann, da Sie fast synchron E / A erhalten.

Eine ausführlichere Erklärung dazu, wie dies funktioniert: https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/