CPU-Ressourcen in KVM auf Debian Squeeze steuern: Cgroups

31. Mai 2011 | Von | Kategorie: Admin | Virtualisierung

In virtualisierten Umgebungen müssen häufig die CPU-Ressourcen den einzelnen virtuellen Gästen zugeordnet werden. Hierbei ist es häufig notwendig einzelne Gäste in ihrem Hunger zu beschränken. Bisher konnte KVM dies nur über Umwege erreichen. Seit einiger Zeit unterstützt der virsh-Befehl über die Libvirt-Bibliothek jedoch die Option schedinfo:

root@kvm:~# virsh help schedinfo
NAME
   schedinfo - show/set scheduler parameters

SYNOPSIS
   schedinfo <domain> [--set <string>] [--weight <number>] [--cap <number>]

DESCRIPTION
   Show/Set scheduler parameters.

OPTIONS
   [--domain] <string>  domain name, id or uuid
   --set <string>   parameter=value
   --weight <number>  weight for XEN_CREDIT
   --cap <number>   cap for XEN_CREDIT

root@kvm:~# virsh schedinfo Server
Scheduler      : Unknown
error: Requested operation is not valid: cgroup CPU controller is not mounted

Die Unterstützung hierfür scheint jedoch auf einem Debian Squeeze per Default nicht aktiviert zu sein. Die Cgroups fehlen.

Cgroup

Was sind Cgroups? Cgroups bieten die Möglichkeit Prozesse zu gruppieren und diese mit Controllern zu überwachen/beschränken. Hierbei erfolgt die Gruppierung über ein virtuelles Dateisystem. In diesem Dateisystem können Unterverzeichnisse angelegt werden, die zur Gruppierung der Prozesse dienen. Diese Gruppen können dann über Controller angepasst werden. Welche Controller angewendet werden, entscheiden Sie bei dem mounten des virtuellen Dateisystem. Grundsätzlich sind die folgenden Controller möglich: ns, memory, cpuset, cpuacct, cpu, devices, freezer, net_cls. Allerdings unterstützt Debian Squeeze noch nicht memory und  KVM/Qemu können hier auch noch nicht alle nutzen! KVM/Qemu unterstützen bisher nur den cpu und devices Controller.

Die einzelnen Cgroups

Welche Cgroups zur Verfügung stehen, zeigt ein cat /proc/cgroups an.

cpuset

Hiermit ist es auf NUMA-Architekturen möglich, einzelne Prozesse auf Numa-Knoten zu beschränken. Siehe auch [http://www.kernel.org/doc/Documentation/cgroups/cpusets.txt].

ns

Diese Cgroup stellt Namespaces zur Verfügung. Damit sehen die Prozesse einer Gruppe nicht die Resourcen anderer Gruppen. Siehe auch [http://www.kernel.org/doc/Documentation/namespaces/compatibility-list.txt]

cpu

Diese Cgroup stellt CPU-Shares zur Verfügung und erlaubt die Aufteilung dieser und die Beschränkung für einzelne Gruppen.

cpuacct

Hiermit kann die Nutzung der CPU überwacht werden. Siehe auch [http://www.kernel.org/doc/Documentation/cgroups/cpuacct.txt]

devices

Dies erlaubt das White- und Blacklisting von Geräten für Prozesse. Libvirt nutzt dies automatisch, wenn es verfügbar ist. Siehe auch [http://www.kernel.org/doc/Documentation/cgroups/devices.txt] und [http://libvirt.org/drvqemu.html#securityacl]

freezer

Hiermit kann ein Batch-Job-Management implementiert werden. Siehe auch [http://www.kernel.org/doc/Documentation/cgroups/freezer-subsystem.txt]

memory

Erst ab 2.6.34 verfügbar. Hiermit kann der Arbeitsspeicher zugeteilt und beschränkt werden. Siehe auch [http://www.kernel.org/doc/Documentation/cgroups/memory.txt]

net_cls

HIermit können Prozessgruppen einzelne QoS Klassen zugeordnet werden. Damit ist die Bandbreitenkontrolle auf Prozessebene möglich. Siehe auch [http://vger.kernel.org/netconf2009_slides/Network%2520Control%2520Group%2520Whitepaper.odt]

Nutzung der Cgroups unter Debian

Die Verwendung der Cgroups mit KVM ist nun trivial einfach. Um die Cgroups unter Debian zu benutzen, müssen erst die Pakete installiert werden:

aptitude install cgroup-bin

Anschließend sollte die Konfigurationsdatei /etc/cgconfig.conf kontrolliert werden. Abweichend von der meisten Dokumentation werden die Cgroups unterhalb von /mnt gemountet. Fedora nutzt hier /dev/cgroups. Spätere Kernel werden möglicherweise /sys/cgroups nutzen.  Da bei Debian nach der Installation automatisch auch die Dienste gestartet werden, ist das virtuelle Dateisystem bereits gemountet:


# ls -R /mnt/cgroups/
/mnt/cgroups/:
cpu  cpuacct  devices

/mnt/cgroups/cpu:
cgroup.procs  cpu.shares  notify_on_release  release_agent  sysdefault    tasks

/mnt/cgroups/cpu/sysdefault:
cgroup.procs  cpu.shares  notify_on_release  tasks

/mnt/cgroups/cpuacct:
cgroup.procs  cpuacct.usage        notify_on_release  sysdefault
cpuacct.stat  cpuacct.usage_percpu  release_agent      tasks

/mnt/cgroups/cpuacct/sysdefault:
cgroup.procs  cpuacct.usage        notify_on_release
cpuacct.stat  cpuacct.usage_percpu  tasks

/mnt/cgroups/devices:
cgroup.procs   devices.deny  notify_on_release    sysdefault
devices.allow  devices.list  release_agent    tasks

/mnt/cgroups/devices/sysdefault:
cgroup.procs   devices.deny  notify_on_release
devices.allow  devices.list  tasks

Anschließend müssen Sie die entsprechenden Dienste, die von den Cgroups betrachtet werden sollen, neu starten:

# /etc/init.d/libvirt-bin restart
Restarting libvirt management daemon: /usr/sbin/libvirtd.
root@station6:~# pgrep libvirtd
12027
root@station6:~# cat /proc/12027/cgroup
3:devices:/sysdefault
2:cpuacct:/sysdefault
1:cpu:/sysdefault

Noch können jedoch die Parameter der virtuellen Maschinen nicht eingestellt werden, da auch diese zunächst neugestartet werden müssen:

root@kvm:~# virsh destroy Server
Domain Server destroyed

root@kvm:~# virsh start Server
Domain Server started

root@kvm:~# virsh schedinfo Server
Scheduler      : posix
cpu_shares     : 1024

Nun können Sie die Shares auch anpassen:

root@kvm:~# virsh schedinfo Server --set cpu_shares=500
Scheduler      : posix
cpu_shares     : 500

Achtung

Problematisch ist aktuell ein Neustart des Dienstes /etc/init.d/cgconfig auf Debian Squeeze, da hierbei das Cgroups Dateisystem gelöscht wird und alle Zuordnungen verloren gehen. Die Zurordnungen, die dynamisch beim Start der Prozesse erfolgten, können bei einem anschließenden Start nicht wieder erzeugt werden. Alle Prozesse müssen dann ebenfalls neugestartet werden. Am besten erfolgt ein Reboot des Systems. Dies ist speziell auch bei einem Upgrade des Pakets kritisch. Daher sollte ein automatischer Upgrade dieses Pakets unterbunden werden!

Post to Twitter Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to Ping.fm Post to Reddit

Schreibe einen Kommentar

Fühle dich ermuntert einen Kommentar, Anmerkungen, Hinweise oder deine Ideen zum Thema zu hinterlassen. Wir freuen uns über deine Rückmeldung.