Ressourcen-Verwaltung mit Control Groups (cgroups)
Die sogenannten cgroups (Control Groups) dienen der Gruppierung von Prozessen. Dies ermöglicht dem Betriebssystem, einer Gruppe von definierten Prozessen ausgewählte Ressourcen zuzuweisen. Dabei werden auch Hierarchien unterstützt. Dieser Artikel zeigt an praktischen Beispielen, wie man cgroups nutzbringend verwendet.
Memory-Subsystem
Das Memory-Subsystem wurde früher in einigen Distributionen absichtlich standardmäßig abgeschaltet oder erst gar nicht im Kernel mitgebaut. Grund hierfür waren anfängliche Skalierungsprobleme, die ab 32 CPUs spürbar wurden und das System ab 64 CPUs nahezu unbrauchbar machten. Diese Probleme gehören allerdings alle der Vergangenheit an. In aktuellen Kernelversionen und Distributionen ist dieses Problem bereits behoben und das System aktiviert und nutzbar.
Das Memory-Subsystem liefert ausführliche Statistiken über den Speicherverbrauch einer Gruppe aus Prozessen, welche sonst mühsam gesammelt werden müssten. So kann unter anderem mit dem Subsystem-Eintrag memory.max_usage_in_bytes auch der Speicher-Spitzenverbrauch einer Control Group gemessen werden. Sehr wertvoll ist auch die Funktion des Memory-Subsystems, einer Gruppe gnadenlos ein Speicherlimit zu setzen. Dies ermöglicht es, speicherhungrige Dienste vom restlichen System zu isolieren. In Verbindung mit dem Group CPU Scheduler ist es sogar möglich, Fork-Bomben-artige Prozesse erfolgreich zu isolieren, ohne die restlichen Gruppen unbrauchbar zu machen oder gar zu beeinflussen. Hierzu wird einfach das entsprechende Limit in den Subsystem-Eintrag memory.limits_in_bytes geschrieben:
# mount -t cgroup -o memory nodev /cgroup # mkdir /cgroup/students # cd /cgroup/students # cat memory.max_usage_in_bytes 0 # echo 800M > memory.max_usage_in_bytes # for n in `cat ../tasks`; do echo $n > tasks ; done # cat memory.usage_in_bytes 569344 # cat memory.max_usage_in_bytes 569344 # cat memory.stat cache 0 rss 237568 mapped_file 0 pgpgin 437 pgpgout 379 inactive_anon 0 active_anon 180224 inactive_file 0 active_file 0 unevictable 0 hierarchical_memory_limit 9223372036854775807 total_cache 0 total_rss 237568 total_mapped_file 0 total_pgpgin 437 total_pgpgout 379 total_inactive_anon 0 total_active_anon 180224 total_inactive_file 0 total_active_file 0 total_unevictable 0
Dieses Beispiel zeigt, dass die leere Gruppe students keinen Speicher bisher verbraucht hat. Anschließend wird das Speicherlimit für diese Gruppe auf 800 Megabyte gesetzt und sämtliche Prozesse aus der Root-Gruppe in diese Gruppe verschoben. Der aktuelle Speicherverbrauch all dieser Prozesse entspricht zugleich der Spitzenlast des bisher gemessenen Speicherverbrauchs. In der Subsystem-Pseudodatei memory.stat können sehr detaillierte Informationen über den aktuellen Speicherverbrauch der Gruppe abgefragt werden.

