Background Flushing unter Linux tritt auf, wenn entweder zu viele geschriebene Daten anstehen (einstellbar über / proc / sys / vm / dirty_background_ratio) oder ein Timeout für anstehende Schreibvorgänge erreicht ist (/ proc / sys / vm / dirty_expire_centisecs). Sofern kein anderes Limit erreicht wird (/ proc / sys / vm / dirty_ratio), werden möglicherweise mehr geschriebene Daten zwischengespeichert. Weitere Schreibvorgänge werden blockiert.
Theoretisch sollte dies einen Hintergrundprozess erzeugen, der schmutzige Seiten ausschreibt, ohne andere Prozesse zu stören. In der Praxis stört es jeden Prozess, der nicht zwischengespeichertes Lesen oder synchrones Schreiben ausführt. Schlecht. Dies liegt daran, dass die Hintergrundbereinigung tatsächlich mit 100% Gerätegeschwindigkeit schreibt und alle anderen Geräteanforderungen zu diesem Zeitpunkt verzögert werden (da alle Warteschlangen und Schreibcaches auf der Straße gefüllt sind).
Gibt es eine Möglichkeit, die Anzahl der Anforderungen pro Sekunde zu begrenzen, die der Spülvorgang ausführt, oder andere Geräte-E / A auf andere Weise effektiv zu priorisieren?
quelle
Antworten:
Nach vielem Benchmarking mit sysbench komme ich zu folgendem Schluss:
Eine Situation zu überleben, in der
Entleere einfach alle Aufzüge, Warteschlangen und schmutzigen Seiten-Caches. Der richtige Ort für fehlerhafte Seiten befindet sich im RAM dieses Hardware-Schreibcaches.
Passen Sie dirty_ratio (oder neue dirty_bytes) so niedrig wie möglich an, achten Sie jedoch auf den sequentiellen Durchsatz. In meinem speziellen Fall waren 15 MB optimal (
echo 15000000 > dirty_bytes
).Dies ist eher ein Hack als eine Lösung, da Gigabyte RAM jetzt nur für das Lese-Caching anstelle von Dirty-Cache verwendet werden. Damit ein fehlerhafter Cache in dieser Situation gut funktioniert, muss der Linux-Kernel-Hintergrund-Flusher die durchschnittliche Geschwindigkeit ermitteln, mit der das zugrunde liegende Gerät Anforderungen akzeptiert, und das Hintergrund-Flushing entsprechend anpassen. Nicht einfach.
Spezifikationen und Benchmarks zum Vergleich:
Getestet, während
dd
Nullen auf die Festplatte geschrieben wurden, zeigte sysbench einen enormen Erfolg : 10 Threads wurden mit 16 kB von 33 auf 700 IOPS (Leerlaufbegrenzung: 1500 IOPS) und ein einzelner Thread von 8 auf 400 IOPS erhöht.Ohne Last waren IOPS nicht betroffen (~ 1500) und der Durchsatz leicht reduziert (von 251 MB / s auf 216 MB / s).
dd
Anruf:für sysbench wurde die test_datei.0 vorbereitet, um unsparse zu sein mit:
Sysbench-Aufruf für 10 Threads:
Sysbench-Aufruf für einen Thread:
Kleinere Blockgrößen zeigten noch drastischere Zahlen.
--file-block-size = 4096 mit 1 GB dirty_bytes:
--file-block-size = 4096 mit 15 MB dirty_bytes:
--file-block-size = 4096 mit 15 MB dirty_bytes im Leerlauf:
sysbench 0.4.12: Multithread-Systembewertungsbenchmark
Testsystem:
Zusammenfassend bin ich jetzt sicher, dass diese Konfiguration im Leerlauf, bei hoher Auslastung und sogar bei voller Auslastung für Datenbankverkehr, der ansonsten durch sequentiellen Verkehr ausgehungert worden wäre, eine gute Leistung erbringt. Der sequenzielle Durchsatz ist höher als zwei Gigabit-Verbindungen ohnehin liefern können, daher ist es kein Problem, ihn ein wenig zu reduzieren.
quelle
dirty_bytes
sollte es kaum hoch genug sein, um die CPUs nicht zu blockieren, während Prozesse schreiben, wenn der Prozess im Durchschnitt mit dem Durchsatz des Geräts schreibt . Wenn Ihr Anwendungscode Zyklen großer Berechnungen durchführt, gefolgt vom Schreiben großer Datenmengen, ist die Optimierung sehr schwierig, da sich die Durchschnittswerte für kurze Zeit stark von denen für lange Zeit unterscheiden. Die richtige Lösung wäre, die prozessspezifischendirty_bytes
Einstellungen anzupassen , aber Linux unterstützt so etwas meines Wissens nicht.Obwohl die Optimierung der Kernel-Parameter das Problem gestoppt hat, ist es tatsächlich möglich, dass Ihre Leistungsprobleme auf einen Fehler auf dem Adaptec 5405Z-Controller zurückzuführen sind, der in einem Firmware-Update vom 1. Februar 2012 behoben wurde. In den Versionshinweisen heißt es: "Es wurde ein Problem behoben, bei dem die Firmware bei hoher E / A-Belastung hängen blieb." Vielleicht hat es genügt, die E / A so zu verteilen, dass dieser Fehler nicht ausgelöst wird, aber das ist nur eine Vermutung.
Hier sind die Versionshinweise: http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf
Auch wenn dies in Ihrer speziellen Situation nicht der Fall war, war ich der Meinung, dass dies Nutzern zugute kommen könnte, die in Zukunft auf diesen Beitrag stoßen. In unserer dmesg-Ausgabe sahen wir einige Meldungen wie die folgende, die uns schließlich zum Firmware-Update führten:
Hier sind die Modellnummern der Adaptec RAID-Controller aufgeführt, die in den Versionshinweisen für die Firmware mit dem Fix für hohe E / A-Probleme aufgeführt sind: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.
quelle
Ein Kernel, der "WBT" enthält:
WBT erfordert kein Umschalten auf die neue Blockebene "blk-mq". Das heißt, es funktioniert nicht mit den E / A-Schedulern CFQ oder BFQ. Sie können WBT mit den Schedulern deadline / mq-deadline / noop / none verwenden. Ich glaube, es funktioniert auch mit dem neuen "Kyber" I / O-Scheduler.
Der WBT-Code skaliert nicht nur die Warteschlangengröße, um die Latenz zu steuern, sondern begrenzt auch die Anzahl der Rückschreibanforderungen im Hintergrund als Anteil des berechneten Warteschlangenlimits.
Die Laufzeitkonfiguration ist in
/sys/class/block/*/queue/wbt_lat_usec
.Die zu suchenden Build-Konfigurationsoptionen sind
Ihre Problemstellung wird zu 100% vom Autor von WBT bestätigt - gut gemacht :-).
quelle
Was ist dein Durchschnitt für Dirty in / proc / meminfo? Dies sollte normalerweise Ihr / proc / sys / vm / dirty_ratio nicht überschreiten. Auf einem dedizierten Dateiserver habe ich dirty_ratio auf einen sehr hohen Prozentsatz des Speichers (90) eingestellt, da ich ihn nie überschreiten werde. Deine Dirty_Ration ist zu niedrig, wenn du sie triffst, bricht alles zusammen, erhöhe sie.
quelle