So verbessern Sie mit cgroups die Performance von Linux Containern
Zur Vermeidung von Performance-Problemen können für Linux Container cgroups erstellt werden, über die sich der Speicher-Zugriff begrenzen lässt.
Container-basierte Virtualisierung, auch Linux Container (LXC) genannt, kann eine sehr effiziente Alternative zu konventionellen Hypervisoren sein. Sind diese allerdings nicht richtig konfiguriert, verbrauchen virtuelle Container möglicherweise große Mengen an Ressourcen und andere Prozesse leiden darunter. Damit wäre die Performance im Keller und der Vorteil von Virtualisierung zunichte gemacht. Administratoren können allerdings sogenannte cgroups verwenden, um dieses Problem zu adressieren. Damit lassen sich Ressourcen-Begrenzungen für Prozesse erzwingen und so stellen Sie sicher, dass die Umgebung so effizient wie möglich läuft.
Was sind cgroups?
Eine cgroup ist ein Verfahren, mit dem Administratoren Ressourcen-Gruppen erstellen und anschließend die Verfügbarkeit dieser Ressourcen für bestimmte Prozesse limitieren können. Ohne cgroups könnte ein virtueller Container allen verfügbaren Speicher an sich reißen und diesen somit anderen Prozessen entziehen. Der Administrator gibt einem speziellen Container durch die Verwendung von cgroups also nur eine begrenzte Menge an Ressourcen. Solche Einschränkungen erstellen Sie auf dem Host-Betriebssystem und weisen diese Beschränkungen allen virtuellen Containern einer Gruppe zu.
So erstellen Sie einen Container mit LXC
Nachdem Sie einen LXC virtuellen Container erschaffen haben, kopiert das System die entsprechenden Dateien in eine chroot-Umgebung. Danach startet der Container auf dem Host-Betriebssystem, das die Benutzung der Ressourcen reguliert. Sobald Sie einen neuen Container starten, erschafft Linux eine cgroup für diesen. Somit können Sie die für diesen Container verfügbaren Ressourcen regulieren.
Durch die Definition von Begrenzungen in den Konfigurations-Dateien der cgroup lassen sich die jeweiligen Ressourcen anpassen. Die Konfigurations-Dateien sind über die Mount Points im Dateisystem des Host-Betriebssystems erreichbar. Unter SUSE Linux Enterprise Server 11.3 liegen sie zum Beispiel unter /sys/fs/cgroup. Jede Ressource bekommt ein eigenes Unterverzeichnis mit dieser Struktur. Diese Dateien können Sie modifizieren und so die Ressourcen-Beschränkungen für die virtuellen Container festlegen.
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,noexec,nosuid,nodev,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,noexec,nosuid,nodev,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,noexec,nosuid,nodev,cpuacct)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,noexec,nosuid,nodev,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,noexec,nosuid,nodev,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,noexec,nosuid,nodev,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,noexec,nosuid,nodev,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,noexec,nosuid,nodev,blkio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,noexec,nosuid,nodev,perf_event)
Sehen wir uns nun an, wie man die Limits anpasst. Speicher-Zugriff kontrollieren Sie via /sys/fs/cgroup/memory. Wechseln Sie in dieses Verzeichnis, finden Sie ein Unterverzeichnis mit Namen lxc. Für jeden Container befindet sich dort abermals ein Unterverzeichnis. Zwei Kontroll-Dateien sind besonders interessant: memory.max_usage_in_bytes und memory.usage_in_bytes.
lin:/sys/fs/cgroup/memory/lxc/sles-lxc1 # ls
cgroup.clone_children memory.max_usage_in_bytes memory.swappiness
cgroup.event_control memory.move_charge_at_immigrate memory.usage_in_bytes
cgroup.procs memory.numa_stat memory.use_hierarchy
memory.failcnt memory.oom_control notify_on_release
memory.force_empty memory.soft_limit_in_bytes tasks
memory.limit_in_bytes memory.stat
lin:/sys/fs/cgroup/memory/lxc/sles-lxc1 # cat memory.max_usage_in_bytes
15302656
lin:/sys/fs/cgroup/memory/lxc/sles-lxc1 # cat memory.usage_in_bytes
13897728
In der obigen Auflistung sehen Sie, dass max_usage_in_bytes derzeit auf 15 Megabyte gesetzt ist. Die derzeitige Auslastung liegt bei zirka 14 Megabyte. Wollen Sie den für diesen Container verfügbaren Arbeitsspeicher erhöhen, können Sie den neuen Wert mittels echo in die Datei schreiben. Nehmen wir an, Sie möchten den maximal verfügbaren Arbeitsspeicher auf 30 Megabyte erhöhen. Dann würden Sie diesen Befehl benutzen:
echo 30605312 > memory.max_usage_in_bytes
Erschaffen Sie einen weiteren Container, bekommt dieser ebenfalls eine Konfigurations-Datei. Diese Datei liegt in der Regel in einem Unterverzeichnis des Verzeichnisses /etc/lxc und trägt denselben Namen wie der Container. In dieser Datei ist die komplette Konfiguration des Containers gespeichert, inklusive der Einstellungen für seine cgroup. Über dieses Verzeichnis können Administratoren die entsprechenden Ressourcen eines virtuellen Containers limitieren. Möglicherweise möchten Sie die Begrenzung des Arbeitsspeichers als permanente Einstellung in die Konfigurations-Datei übernehmen. Dann würden Sie die Zeile lxc.cgroup.memory.max_usage_in_bytes am Ende der Konfigurations-Datei einfügen und am Ende den gewünschten Wert anfügen. Starten Sie das nächste Mal einen virtuellen Container, wird dieser mit dem maximalen Arbeitsspeicher-Limit erschaffen, das Sie in der Konfigurations-Datei hinterlegt haben.
Neben der Begrenzung der verfügbaren Ressourcen für spezielle Container können cgroups den Zugriff dieser Container auf bestimmte Geräte limitieren. Sie sehen ein Beispiel davon in der Konfigurations-Datei des Containers. Dort liegen die Einstellungen für den Geräte-Zugriff.
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm
Administratoren können diese Zeilen modifizieren. So definiert man, auf welche Geräte ein virtueller Container Zugriff hat und erschafft eine sicherere Umgebung.
Folgen Sie SearchDataCenter.de auch auf Facebook, Twitter und Google+!