Wie Sie wissen, sind GNU und Linux einfach genial. Warum? Weil es Control Groups (CGroups) gibt! In diesem Beitrag
- erfahren Sie, wie Sie kritische Systemprozesse für Speicher und CPU schützen.
- ehen Sie in einem Video, wie CGroups auf einem live laufenden Server implementiert werden.
- erfahren Sie, wie Sie eine Beispielimplementierung von CGroups oder SystemD-Slices einrichten.
Alles unter Kontrolle
YSie können CGroups verwenden, um die Menge der Ressourcen zu beschränken, die ein Prozess oder eine Gruppe nutzen darf. Ja. Stimmt. Nie mehr zu wenig Speicherplatz oder überladene CPUs, sobald Sie diesen ressourcenhungrigen Prozess CGroups unterstellen.
Wir bei CloudSigma lieben sie – sogar so sehr, dass wir sie auch einsetzen! Überall! Wir verwenden CGroups für unsere Kaffeetassen! Nein, ernsthaft, wir verwenden sie, um die Ressourcen zu beschränken, die für die Prozesse auf unseren Servern verfügbar sind. Auf diese Weise halten wir die Ressourcen in Schach.
Noch besser – wir verwenden sie, um Ressourcen für die wichtigsten Subsysteme auf unseren physischen Servern zu garantieren, was Stabilität für virtuelle Maschinen von Kunden garantiert.
Zum Beispiel darf unser System Slice 4 GiB haben! Das ist mehr als genug, um jedes GNU- und Linux-System zu betreiben, oder? … normal sind es 640 kiB … ????
Wie machen wir das? Wie können wir sogar Ressourcen für, sagen wir, unser verteiltes Speichersystem garantieren?
Einfach! Wir beschränken alles! Und lassen genügend Ressourcen für die verteilte Speicher-CGroup verfügbar, die gleichzeitig ihre eigenen Einschränkungen hat! MWAHAHAHA!!
Was? Sie wissen nicht, wie Sie CGroups einrichten? OK, lassen Sie mich Ihnen die Grundlagen erklären …
Es gibt verschiedene Arten von CGroups. Wir haben Speicher-CGroups, CPU-CGroups, Block-Device-CGroups usw.!
Im folgenden Video können Sie mir dabei zusehen, wie ich einen Prozess in einem laufenden System einschränke:
Start
Das Wichtigste zuerst: Installieren Sie die Werkzeuge, die Sie benötigen, um CGroups zu manipulieren. Das ist viel einfacher.
Ich verwende Funtoo/Gentoo und Fedora. Daher sind die Beispiele auf diese Betriebssysteme abgestimmt, sie gelten jedoch für alle Linux-Distributionen:
# Funtoo/Gentoo su -c 'emerge libCGroup' # Fedora su -c 'yum -y install libCGroup-tools'
Und jetzt sind wir bereit für die Erstellung einiger CGroups.
Sagen wir, Sie haben einen Benutzer in Ihrem Server, der mehr Speicher belegt als sie ihm/ihr zuweisen wollen. Nehmen wir an, er heißt Blagovart. Er nutzt Litecoin-Mining und Sie wollen den Speicher und die CPU beschränken, die er dafür verwendet.
Wir erstellen CGroups für CPU und Speicher:
# become root su - # create blagovart's CGroup cgcreate -g cpu,memory:blagovart
Dieser Befehl erstellt ein Verzeichnis unter: /sys/fs/CGroup/cpu/blagovart und /sys/fs/CGroup/memory/ blagovart. Wir hätten das auch mit mkdir erstellen können, was zum gleichen Ergebnis geführt hätte. Es ist jedoch besser, die von libCGroup bereitgestellten Wrapper-Tools zu verwenden. Diese Tools kümmern sich um einige der Anforderungen, damit die CGroups arbeiten, erzeugen jedoch auch aussagekräftige Fehler … gut, manchmal zumindest.
Wir haben also die CPU- und Speicher-CGroups für Blagovart erstellt! Nun erstellen wir einen Container für sein Skript:
cgcreate -g cpu,memory:blagovart/litecoin-mining
Und legen sein Skript hierher:
cgclassify -g cpu,memory:blagovart/litecoin-mining $( pidof my-litecoin-mining-script )
Sein Skript ist jetzt im Container, aber wir haben noch keine Grenzen gesetzt. Lassen Sie uns einige Grenzen setzen:
# Set memory to 1 GiB cgset -r memory.limit_in_bytes=1G blagovart/litecoin-mining # Set CPU priority to ~10% (1024 is 100% priority) cgset -r cpu.shares=102 blagovart/litecoin-mining
So, jetzt ist Blagovart kein „Ressourcen-Schwein“ mehr und der Rest der Nutzer kann glücklicher sein!
Jetzt können wir das für das ganze System machen.
SystemD Slices
Wenn Sie ein SystemD-System wie Fedora verwenden, sollten Sie sich über Slices informieren. Man kann Ressourcenbeschränkungen und Gruppenprozesse einfach in ihnen konfigurieren und ihre Ressourcennutzung begrenzen.
Beispiel:
# constraint users' memory usage to 256 MiB systemctl set-property user.slice MemoryLimit=256M # constraint system's memory usage to 512 MiB systemctl set-property system.slice MemoryLimit=512M
Erledigt! Das ist jetzt persistent. Jetzt gibt es noch einige Änderungen und Dinge, die Sie neu starten müssen, damit sie angewendet werden.
Dieser Befehl erstellt die folgenden Dateien:
/etc/systemd/system/system.slice.d/50-MemoryLimit.conf /etc/systemd/system/user.slice.d/50-MemoryLimit.conf
Wenn Sie die Einstellungen entfernen möchten, löschen Sie sie einfach und starten Sie neu.
Auf Systemen, die teilweise SystemD verwenden, wie Ubuntu 14.04, oder kein SystemD, wie Funtoo, haben Sie andere Möglichkeiten.
Einer von ihnen ist:
# /etc/cgconfig.conf group litecoin-mining { cpu { } memory { } } group blagovart/litecoin-mining { cpu { cpu.shares = 102; } memory { memory.limit_in_bytes = 1G; } }
Der Nachteil ist, dass ich sein Skript noch nicht in den CGroups habe. Dies schafft nur die CGroup-Struktur, mit der ich dem Prozesse zuordnen kann. In diesem Fall könnte ich einfach:
cgclassify -g cpu,memory:blagovart/litecoin-mining $( pidof my-litecoin-mining-script )
Und dann gibt es Ubuntu. So weit ich weiß, hat Ubuntu 14.04 – aktuell das neueste LTS – Probleme damit und Sie brauchen einen alternativen Ansatz, wie ein init-Skript:
# /etc/init/cgroups-myCGroups description "My CGroups Init" author "Renich Bon Ciric " start on started CGroup-lite console log pre-start script # create main CGroups cgcreate -g cpu,memory:blagovart # set memory to 1 GiB cgset -r memory.limit_in_bytes=1G blagovart/litecoin-mining # set CPU priority to ~10% (1024 is 100% priority) cgset -r cpu.shares=102 blagovart/litecoin-mining end script
Das war‘s! Sie haben jetzt CGroups konfiguriert. Wie Sie sehen können, ist die Verwaltung einfach. Noch vorteilhafter ist jedoch ein SystemD-kompatibles System, mit dem sie alle mittels Slices verwalten können.
CGroups sind eine geniale Ressource aus dem Linux-Kernel. Sie können sie praktisch überall verwenden, wo Sie die Ressourcennutzung steuern möchten. Zum Beispiel haben wir eine CGroup-Bibliothek namens cgroupspy, die Sie aus Python frei mit CGroups verwenden können. Wie gewohnt ist unsere Lizenz so frei wie möglich: Neue BSD.
Referenzen
- https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt
- https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
- http://www.freedesktop.org/software/systemd/man/systemd.slice.html
- http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html
- https://wiki.archlinux.org/index.php/Cgroups
- HowTo: CGroups - Dezember 13, 2016