Howto Cgroups

HowTo: CGroups

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

00fdaa19dc42fd452f5fdd9cc5cd3087?s=80&r=g

About Renich

DevOps @ CloudSigma during the day, Creative Commons artist and producer on my free time... Yeah, that means going to play my guitar or piano on the streets sometimes. You can listen to my music in my personal project: Renich or my Rock project: introbella. And I'm sure I have a cover or two @ YouTube. I am, also, a Fedora and Funtoo maintainer and contributor. In fact, you can just google me "Renich" and you'll find my website and other stuff. I have a blog somewhere; where I write technical stuff as well. I am sure you can't imagine the blog's title 😉 On other matters, I've met Richard Stallman, started the local PHP and Ruby groups and contribute continuously to LinuxCabal.