Wir werden uns mit den Regulierungsbehörden des Datenspeichersubsystems befassen und sehen, was sie Ihnen im Sinne von Block I / O ermöglichen.

Was hier besonders interessant ist, ist, dass wir ein Gebiet betreten, in dem Änderungen an den Einstellungen, die nach dem Start des Systems vorgenommen werden, viel weniger wichtig sind als Entscheidungen, die bereits vor seiner Bereitstellung getroffen werden.
Schauen Sie sich das Bild unten an.
Es enthält vier Hauptressourcen, die ein moderner Computer benötigt, um ordnungsgemäß zu funktionieren. Leistungsoptimierung ist die Kunst, diese Ressourcen optimal auf Anwendungsprozesse zu verteilen. Darüber hinaus sind alle diese Ressourcen nicht unbegrenzt und hinsichtlich der Auswirkungen auf die Produktivität nicht gleichwertig.
Die Leistung des Speichersubsystems reduziert sich auf die Leistung der darin verwendeten Speichertechnologien: Festplatten, SSD, SAN, NAS - sie können in Bezug auf Zugriffsgeschwindigkeit und Durchsatz stark variieren. Ein leistungsstarker Prozessor und viel Speicher werden die Situation nicht retten, wenn die Speichergeräte die Anforderungen der zu lösenden Aufgaben nicht erfüllen.
Wenn Sie als Linux-Spezialist Hardwareentscheidungen beeinflussen können, stellen Sie sicher, dass Ihr Unternehmen über eine angemessene (oder überlegene) Speicherplattform verfügt. Dies wird in Zukunft viele Probleme ersparen.
Lassen Sie uns nun sehen, was mit Hilfe von Eingabe- / Ausgabesteuerungen (E / A) getan werden kann.
Alles dreht sich um Speichergeräte
Offiziell heißt der E / A-Controller blkio, aber bei guter Laune reagiert er auf Blocky. Wie der CPU-Controller verfügt Blocky über zwei Betriebsarten:
- Anpassung mithilfe relativer E / A-Bälle (Freigaben), mit denen Sie die Leistung auf der Ebene aller oder ausgewählter Blockspeichergeräte steuern können, indem Sie Werte im Bereich von 10 bis 1000 einstellen. Standardmäßig wird 1000 verwendet, sodass Änderungen nur die E / A-Bälle reduzieren Der ausgewählte Benutzer oder Dienst. Warum 1000, nicht 1024, wie bei der CPU? Gute Frage. Anscheinend ist dies der Fall, wenn die Offenheit von Linux nicht gut für ihn ist.
- Absolute Bandbreitenanpassung zur Begrenzung der Lese- und / oder Schreibgeschwindigkeit für einen bestimmten Benutzer oder Dienst. Standardmäßig ist dieser Modus deaktiviert.
Der folgende Screenshot zeigt die Parameter, die mit dem Befehl systemctl angepasst werden können. Hier haben wir die Magie der automatischen Eingabeaufforderungen auf der Tabulatortaste verwendet, um eine Liste von Optionen anzuzeigen. Dies wird als Bash-Vervollständigung bezeichnet. Wenn Sie diese Funktion immer noch nicht verwenden, müssen Sie das entsprechende PRM installieren.
Relative E / A-Bälle werden durch die Parameter BlockIODeviceWeight und BlockIOWeight gesteuert. Bevor Sie mit diesen Controllern spielen, müssen Sie Folgendes verstehen: Sie funktionieren nur, wenn der CFQ-E / A-Planer für das Speichergerät aktiviert ist.
Was ist ein E / A-Planer? Beginnen wir von weitem und denken Sie daran, dass der Linux-Kernel dafür verantwortlich ist, dass alle Hardwarekomponenten des Computers korrekt miteinander kommunizieren. Und da alle diese Komponenten gleichzeitig unterschiedliche Dinge wollen, kann man nicht ohne Bestellung auskommen. Wie organisieren wir zum Beispiel unser Leben, strukturieren es für Arbeit, Ruhe, Schlaf und so weiter?
Wenn es sich um Speichergeräte handelt, ist der E / A-Scheduler für die Organisation ihrer Arbeit im Kernel verantwortlich. Dies ist nur ein Programmcode, der eine Möglichkeit definiert, den Datenfluss für Blockgeräte zu steuern, von USB-Flash-Laufwerken und Festplatten bis hin zu virtuellen Festplatten, bei denen es sich tatsächlich um Dateien auf ISCI-Geräten in einem SAN handelt.
Zusätzlich zu all diesen Geräten, die unter Linux verwendet werden können, gibt es verschiedene Aufgaben, die ein Computer ausführen muss. Darüber hinaus gibt es im wirklichen Leben das, was wir bei Red Hat "Anwendungsfälle" nennen. Deshalb gibt es verschiedene Planer, die sich auf verschiedene Szenarien konzentrieren. Diese Scheduler heißen Noop, Deadline und CFQ. Kurz gesagt, jeder von ihnen kann wie folgt beschrieben werden:
- Noop - gut geeignet für Blockspeichergeräte ohne rotierende Teile (Flash, SSD usw.).
- Deadline ist ein einfacher Scheduler, der sich auf die Minimierung von Verzögerungen konzentriert. Standardmäßig wird dem Lesen auf Kosten des Schreibens Vorrang eingeräumt, da die meisten Anwendungen beim Lesen stolpern.
- Cfq - konzentriert sich auf die gerechte Verteilung der E / A-Bandbreite auf systemweiter Ebene. Und wie oben erwähnt, ist dies der einzige Scheduler, der relative E / A-Optionen für Gruppen unterstützt.
Weitere Informationen zu Schedulern finden Sie im Red Hat Enterprise Linux 7-Handbuch zur Leistungsoptimierung.
Was war all diese Diskussion über Planer? Außerdem wird cfq auf den meisten Computern standardmäßig NICHT verwendet, wenn sie keine SATA-Laufwerke haben. Ohne dies zu wissen, können Sie BlockIOWeight ändern, bis Sie ohne Effekt blau werden. Leider wird systemd Ihnen nicht sagen: „Entschuldigung, Sie versuchen vergeblich, diesen Parameter zu ändern. Dies funktioniert nicht, da das Gerät den falschen Scheduler verwendet. "
Wie können Sie sich über diese „interessante“ Funktion informieren? Wie üblich aus der cgroups-Dokumentation, über die wir in einem früheren Beitrag geschrieben haben. Es ist immer nützlich, sich damit vertraut zu machen, bevor Sie diese oder jene Regler verwenden.
Wir gehen zum Anwendungsfall über

Wieder gehen wir von allgemeinen Worten zu Einzelheiten über: Lassen Sie mich Ihnen Herrn Kryakin vorstellen.
Er ist im Catering tätig und verfügt auf dem Anwendungsserver über zwei Datenbanken zur Auftragsverfolgung. Herr Kryakin besteht darauf, dass die Datenbank der Bestellungen für Entengerichte viel wichtiger ist als die Basis für Gänsegerichte, da Gänse Betrüger auf dem Thron der Wasservögel sind.
Beide Datenbanken sind als Dienste konfiguriert und ihre Einheitendateien sehen folgendermaßen aus:
Tatsächlich erledigen die darin aufgerufenen Skripte (duck.sh und goose.sh) keine echte Arbeit in der Datenbank, sondern simulieren nur das Lesen und Schreiben mit dd-Befehlsschleifen. Beide Skripte verwenden das Dateisystem / database, das sich auf der virtuellen Festplatte befindet.
Lassen Sie uns Ente und Gans laufen lassen und sehen, wo sie in der Gruppenhierarchie landen:
Und jetzt, da wir die PIDs der dd-Prozesse kennen, wenden wir uns dem Befehl iotop zu, um zu sehen, was im Speichersubsystem passiert:
Nun, 12-14 MB / s ... nicht schnell. Es scheint, dass Herr Kryakin nicht viel in das Datenspeichersystem investiert hat. Obwohl wir bereits Fragen zur Angemessenheit hatten, gibt es nicht viel zu überraschen.
Nun betrachten wir unsere beiden Aufgaben: PID 3301 (Gans) und PID 3300 (Ente). Jeder verwendet E / A irgendwo um 6 MB / s. Der obige Bildschirm ist ein bisschen anders, aber in Wirklichkeit springen sie ständig, und im Durchschnitt teilen sich diese beiden Aufgaben die Bandbreite des Speichergeräts gleichermaßen.
Herr Kryakin möchte, dass Ente mindestens fünfmal mehr E / A-Bandbreite als Gans hat, daher werden Entenbestellungen immer zuerst verarbeitet. Versuchen wir, den BlockIOWeight-Parameter dafür mit den folgenden Befehlen zu verwenden:
Wir schauen uns iotop an und sehen, dass es nicht funktioniert hat:
Lassen Sie uns den E / A-Scheduler für das Gerät / dev / vdb überprüfen:
Interessant ... Wir versuchen, den Scheduler auf cfq zu ändern, und es wird nichts daraus. Warum?
Tatsache ist, dass unser System auf einer virtuellen KVM-Maschine ausgeführt wird und sich herausstellt, dass der
Scheduler ab Version 7.1 in Red Hat Enterprise Linux nicht mehr
geändert werden kann . Dies ist kein Fehler, sondern eine Funktion zur Verbesserung der Mechanismen für die Arbeit mit virtualisierten E / A-Geräten.
Aber verzweifeln wir nicht. Wir haben zwei weitere Parameter, die geändert werden können: BlockIOReadBandwidth und BlockIOWriteBandwidth arbeiten auf Blockgeräteebene und ignorieren den E / A-Scheduler. Da wir die Bandbreite des Geräts / dev / vdb kennen (ungefähr 14 MB / s für Empfang und Ausgabe) und die Gans auf 2 MB / s begrenzen, scheinen wir in der Lage zu sein, Herrn Kryakins Wunsch zu erfüllen. Versuchen wir mal:
Wir schauen: PID 3426, auch bekannt als Gans, verwendet jetzt E / A irgendwo um die 2 MB / s und PID 3425, das heißt, Ente, für fast alle 14!
Hurra, wir haben getan, was der Kunde wollte, was bedeutet, dass wir nicht nur eine bestimmte Anzahl von Gänsen gerettet haben, sondern auch unseren Ruf als Linux-Guru.