Kampf um Ressourcen, Teil 5: Von vorne anfangen

    Wir studieren weiterhin cgroups. In Red Hat Enterprise Linux 7 sind sie standardmäßig aktiviert, da hier systemd verwendet wird und es bereits eingebaute cgroups hat. Mit Red Hat unterscheidet sich Red Hat Enterprise Linux 6 etwas. Tatsächlich waren cgroups-Controller ursprünglich da und dort, und diese Version kam im Januar 2010 heraus, das heißt, vor ein paar Jahrhunderten, ausgedrückt in Computerjahren.



    Cgroups in Red Hat Enterprise Linux 6 und heute sind jedoch zu vielen Dingen fähig, die wir heute veranschaulichen werden.

    Lassen Sie uns die cgroups-Funktionen in Red Hat Enterprise Linux 6 an einem rein hypothetischen Beispiel analysieren, das vollständig auf realen Ereignissen basiert. Aber zunächst einmal ein kleiner Exkurs.

    Bei der IT-Sicherheit gab es noch nie so viele Probleme wie jetzt. Es ist nicht verwunderlich, denn heute sind nicht nur alle Computer und Telefone an das Netzwerk angeschlossen, sondern auch Kühlschränke, Staubsauger und eine ganze Reihe von anderen Dingen. Die Möglichkeiten für Netzwerkbedrohungen sind einfach immens. Und der Kampf gegen diese Bedrohungen beginnt in der Regel sofort an allen Fronten. Schnelle Installation von Sicherheitspatches? Ja, unbedingt! Stärkung des Schutzes des Systems - Firewalls, SELinux, kompetente Authentifizierung, ist das alles? Natürlich! Antivirusscanner auf Linux-Maschinen? Nun, wie soll ich sagen ...

    Auf Linux-Computern richten Virenschutzscanner manchmal mehr Schaden an als Nutzen. Bezopasnik hat jedoch ihre Gründe, und häufig müssen regelmäßig Virenschutzprüfungen durchgeführt werden, wobei aus technischer Sicht nicht wirklich über ihre Gültigkeit nachgedacht wird. Und dies ist die Realität, mit der wir uns auseinandersetzen müssen und mit der fast jeder IT-Mitarbeiter früher oder später konfrontiert ist.

    Der zweite Punkt ist, dass Red Hat Enterprise Linux 7 sicherlich modisch, fortschrittlich und cool ist, aber viele verwenden Red Hat Enterprise Linux 6 noch immer und denken nicht daran, es aufzugeben. Die Leute entscheiden sich daher für Red Hat - Sie können sich jahrelang auf dieselbe Version setzen und haben immer noch die neuesten Patches, Updates und Support.

    Zurück zu unserem Beispiel ... Stellen Sie sich vor, es gibt einen Kerl namens Jerry. Jerry arbeitet in einem großen Büro und ist für die Server von Red Hat Enterprise Linux 6 zuständig. Er ist vollkommen zufrieden mit der Funktionsweise und benötigt keine neuen Probleme und Probleme.

    Aber dann entscheiden die Jungs von der Sicherheitsabteilung, dass alle Server eine Sache namens ScanIT einsetzen müssen. Da dieses Laufwerk Festplatten und Arbeitsspeicher regelmäßig auf Viren und andere Malware überprüft, ist ein vollständiger Root-Zugriff erforderlich.

    Jerry seufzt, legt seine Gitarre ab und setzt ScanIT auf eine Testmaschine. Ziemlich schnell stellt sich heraus, dass:

    • Wenn Sie einen Virenschutz-Scan ausführen, verbraucht scanit (dies ist das Skript zum Starten des Prozesses) die gesamte CPU-Zeit, die Sie erreichen können. Und das ist ein sehr ungünstiger Effekt auf die Arbeit der Testmaschine - sobald Jerry sie nicht einmal über SSH erreichen konnte.
    • Darüber hinaus frisst der Prozess scanit von Zeit zu Zeit Speicher als nicht in sich selbst. Als Folge davon wacht der OOM Killer auf und beginnt, andere Prozesse als den Scanit selbst zu beenden.

    Im Allgemeinen muss etwas dagegen unternommen werden.

    Jerry greift nach der Gitarre und beginnt mit dem Grateful Dead zu denken. Ziemlich schnell kommt ihm der Gedanke in den Sinn, dass hier genau diese Gruppen von Red Hat Enterprise Linux 7 helfen können, bei denen ein Kumpel namens Alex alle Ohren summt. Jerry legt die Gitarre wieder beiseite und liest Docks, die Alex unter Red Hat Enterprise Linux 6 gesendet hat . Es stellt sich heraus, dass er als erstes libcgroup benötigt.

    Es gibt keine libcgroup auf dem Testcomputer, also beginnt Jerry mit der Installation:



    Darüber hinaus enthält Jerry zwei Dienste, die für die Arbeit von permanenten (persistenten) Gruppen erforderlich sind:

    • cgconfig - bietet eine mehr oder weniger einfache Benutzeroberfläche für die Arbeit mit cgroup-Bäumen. Natürlich könnte Jerry Cgroups manuell einbauen und konfigurieren, aber warum, wenn Sie Zeit sparen können?
    • cgred - dies ist eine cgroup-Regelengine: Wenn ein Prozess gestartet wird, ordnet dieser Dienst ihn gemäß den angegebenen Regeln in der einen oder anderen cgroup ein.




    Wenn Sie all dies installieren und konfigurieren, kann Jerry direkt mit dem Problem selbst fortfahren. Nachdem er es gut überlegt hat, trifft er folgende Entscheidung:

    • scanit und seine untergeordneten Prozesse sollten nicht mehr als 20% der CPU-Ressourcen verbrauchen. In der Tat sogar weniger - nicht mehr als 20% der Ressourcen eines einzelnen Prozessorkerns, selbst auf einer Multi-Core-Maschine. In cgroups erfolgt dies mit CPU-Kontingenten.
    • In Bezug auf den Arbeitsspeicher sollten scanit und seine untergeordneten Prozesse nicht mehr als 512 MB Systemspeicher beanspruchen. Wenn sie diese Linie überschreiten, sollte das System sie beenden und keine anderen Prozesse.

    Sag mir nicht was ich tun soll!


    Jerry muss sich mit zwei Sätzen von Konfigurationsdateien befassen:
    • /etc/cgconfig.conf - Wird bei der Installation von libcgroup automatisch generiert.
    • /etc/cgrules.conf - enthält einen Regelsatz für Regelsätze, nach dem cgred Prozesse nach cgroups-Gruppen sortiert.

    Hier ist die Standarddatei cgconfig.conf:



    Jerry hätte die nötigen Änderungen direkt an ihm vornehmen können, aber es ist besser, dafür Drop-In-Conf-Dateien zu verwenden. Wie funktioniert das? Wenn Sie im Ordner /etc/cgconfig.d eine beliebige Datei mit der Erweiterung .conf (engl. Drop-in - throw) ablegen, verarbeitet das System diese Datei und nimmt die entsprechenden Änderungen an der Konfiguration vor. Dies ist praktisch, weil Sie Drop-Ins für verschiedene Aufgaben erstellen und mit den Tools, die Ihnen am besten gefallen, hinzufügen oder entfernen können (z. B. Ansible, das ist immer noch ein Red Hat-Blog).

    Zunächst erstellt Jerry eine Drop-In-Datei für die CPU:



    Wir schauen, dass hier bei uns und wie es funktioniert.

    Das Schlüsselwort group gibt einfach den Namen der neuen cgroup-Gruppe an, in unserem Fall scanit. In den geschweiften Klammern geben wir die Steuerelemente an, die wir verwenden möchten. Es gibt cpu.cfs_period_us und cpu.cfs_quota_us, sie ermöglichen es Ihnen entsprechende Grenzen für den Completely Fair Scheduler zu setzen, Scheduler Kernel, der in Red Hat Enterprise Linux standardmäßig verwendet wird , 6. Mal sehen , was über sie geschrieben ist der Leitfaden für Red Hat Enterprise Linux Management 6 :



    Mit anderen Worten, schrieb Jerry in seinem Drop-In: „Für jeden Prozess, der sich auf cgroup namens scanit bezieht, überprüfen Sie die Menge der CPU-Ressourcen, die ihm pro Sekunde zugewiesen werden. Wenn die Gesamtprozessorzeit für alle Prozesse in dieser Gruppe mehr als 200.000 Millisekunden beträgt, beenden Sie die Ausgabe der Prozessorzeit für diese Prozesse vollständig. “ Nun, das heißt, um allen Prozessen in der cgroup-group scanit sowie ihren untergeordneten Prozessen insgesamt nicht mehr als 20% der CPU-Zeit zuzuweisen.

    Nach dem Neustart von cgconfig aktualisiert der Server die Konfiguration. Wenn wir in das Dateisystem gelangen, werden wir feststellen, dass sich scanit jetzt im CPU-Controller-Verzeichnis befindet:



    Das ist natürlich gut, aber wir müssen den scanit selbst irgendwie in diese Gruppe aufnehmen. Hier ist crge praktisch, standardmäßig sieht es so aus:



    Die Verwendung dieser Datei ist mehr oder weniger einfach. Richtig, dafür müssen wir die Datei cgrules.conf direkt bearbeiten, da der Drop-In-Mechanismus hier nicht unterstützt wird. Wir geben den Benutzer oder die Gruppe an, der der Prozess gehört, sowie den Namen des gewünschten Prozesses (falls gewünscht) sowie die benutzerdefinierte Controller- und Cgroup-Zielgruppe.

    In unserem Beispiel verwenden wir anstelle eines echten Anti-Virus-Scanit Scanit ein Skript, das auch als Scanit bezeichnet wird, aber die Last nur emuliert. Ohne cgroup sieht alles so aus:





    Die CPU ist voll besetzt, meistens mit Benutzerplatz und etwas System.

    Jerry kratzt sich am Bart. Er startet vi und nimmt mit strikt einem Zeigefinger einige Änderungen vor und startet die Daemon-Komponente erneut:



    Dann startet er manuell scanit ...:



    Und - Hurra! Sieg



    Wie Sie sehen, verbrauchen unsere Lastemulationsprozesse (untergeordnete Prozesse von scanits) jetzt insgesamt 20% der CPU-Ressourcen, hauptsächlich im Benutzerbereich und etwas im System. Dieses verdammte Antivirusprogramm lädt das Auto also nicht mehr auf, um den Wahnsinn zu vervollständigen.

    Erinnern Sie sich an was als nächstes?


    Jerry war vom Erfolg begeistert und vergaß beinahe die Erinnerung. Dann erinnert er sich noch und startet vi erneut, um seine Konfigurationsdatei zu reparieren.

    Jetzt werden zwei speicherbezogene Einstellungen hinzugefügt:
    • Speicher.limit_in_bytes - max. Der Arbeitsspeicher, den alle Prozesse in der cgroup-group scanit verwenden können, ist total. Und ohne dabei im Swap zu sein. Jeri begrenzt seine 256 MB
    • Memory.memsw.limit_in_bytes - max. Die Menge an RAM plus der Speicherplatz in der Auslagerungsdatei, der allen Prozessen in der cgroup-group scanit zugewiesen werden kann, ist total. Wenn dieser Schwellenwert überschritten wird, beendet der OOM-Killer die Prozesse. Jerry setzt es auf 512 MB.




    Oh nein! Was ist los?

    Jerry sieht nach oben und sieht, dass die untergeordneten Prozesse von scanit noch laufen. Da diese Gruppe verwendet wird, kann Jerry den Dienst nicht starten. Daher werden untergeordnete Prozesse manuell beendet und solche Dienste neu gestartet.



    Jetzt noch ein bisschen in cgred.conf editieren:



    Zur Überprüfung führt Jerry mehrere Scanit-Aufgaben gleichzeitig aus, sodass der OOM-Killer sicher funktioniert.



    Dann blickt Jerry auf das Systemprotokoll und nickt zufrieden: Scanit kann den Speicher nicht mehr ungestraft austreiben.



    Wir hoffen, dass Sie mit unserer cgroups-Serie verstanden haben, was es ist, wie man es in Red Hat Enterprise Linux 7 verwendet, wie man es in Red Hat Enterprise Linux 6 erstellt und wie es in Ihrer Umgebung verwendet wird.


    Jetzt auch beliebt: