Zuletzt aktualisiert am 28. Oktober 2023
Wie kann man Kontrollgruppen verwenden, um Aufgaben auf eine bestimmte CPU oder einen Prozentsatz aller CPUs zu beschränken?
Zielsetzungen
Dieser Beitrag zeigt Ihnen, wie Sie Kontrollgruppen ( cgroup-v1, cgroup-v2 ) verwenden können, um Aufgaben auf eine bestimmte CPU oder einen Prozentsatz aller CPUs zu beschränken. Wir werden spezifische Kontrollgruppen erstellen, denen wir eine Shell hinzufügen werden. Von dieser Shell aus werden wir stress-ng ausführen. Htop und ps(1) helfen bei der Überwachung der Vorgänge.
Voraussetzungen
Wir verwenden cgroup-v1 hier. Das bedeutet, dass ein etwas neuerer Kernel, der richtig konfiguriert wurde, in Ordnung sein sollte. Als Root-Dateisystem verwenden wir ein core-image-minimal
hier. Dies verwendet systemd als Init-Manager und ein paar einfache Werkzeuge.
Kernel-Konfiguration
Dies sind die cgroup-bezogenen Kernelkonfigurationen:
root@multi-v7-ml:~# zcat /proc/config.gz | grep CGROUP
CONFIG_CGROUPS=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_RDMA=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y CONFIG_CGROUP_DEBUG=y CONFIG_SOCK_CGROUP_DATA=y CONFIG_BLK_CGROUP_RWSTAT=y # CONFIG_BLK_CGROUP_IOLATENCY is not set # CONFIG_BLK_CGROUP_IOCOST is not set CONFIG_CGROUP_NET_PRIO=y # CONFIG_CGROUP_NET_CLASSID is not set
core-image-minimal mit systemd
Ich habe dafür eine spezielle resy-systemd-Distro-Konfiguration erstellt. Das sind die Variablen, die von Interesse sind, und heutzutage könnte man es auch mit weniger Variablen machen:
# I want to use systemd here instead of sysvinit DISTRO_FEATURES_append = " systemd" VIRTUAL-RUNTIME_init_manager = "systemd" DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit" VIRTUAL-RUNTIME_initscripts = "" VIRTUAL-RUNTIME_dev_manager ?= "" VIRTUAL-RUNTIME_login_manager ?= "" VIRTUAL-RUNTIME_init_manager ?= "" VIRTUAL-RUNTIME_initscripts ?= "" VIRTUAL-RUNTIME_keymaps ?= ""
Pakete, die zu core-image-minimal hinzugefügt werden sollen
Es wäre besser, hier ein "image-recipe" zu erstellen, aber wir werden einfach die local.conf hacken:
IMAGE_INSTALL_append = " htop stress-ng dropbear packagegroup-core-base-utils tree"
htop
Htop ist ein plattformübergreifender interaktiver Prozessbetrachter. Es handelt sich um eine Textmodus-Anwendung (für Konsolen oder X-Terminals) und erfordert ncurses.
stress-ng
Stress-ng testet verschiedene physikalische Subsysteme eines Computers. Es funktioniert auch auf verschiedenen Kernel-Schnittstellen des Betriebssystems.
dropbear
Dropbear ist ein relativ kleiner SSH-Server und -Client. Er läuft auf einer Vielzahl von POSIX-basierten Plattformen. Dropbear ist eine Open-Source-Software, die unter einer MIT-ähnlichen Lizenz vertrieben wird. Dropbear ist nützlich für "eingebettete" Linux-Systeme.
packagegroup-core-base-utils
Ich verwende diese Paketgruppe, um vollständigere Versionen von Standard-Unix/Linux-Werkzeugen wie ps(1) zu haben.
tree
Tree(1) listet den Inhalt von Verzeichnissen in einem baumartigen Format auf.
Übersicht
Mehrere Kerne
Nehmen wir an, wir haben eine symmetrische Multi-Core-Maschine mit 4 Kernen:
root@multi-v7-ml:~# cat /proc/cpuinfo
processor : 0 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 6.00 Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 10 processor : 1 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 6.00 Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 10 processor : 2 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 6.00 Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 10 processor : 3 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 6.00 Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 10 Hardware : Freescale i.MX6 Quad/DualLite (Device Tree) Revision : 0000 Serial : 0000000000000000
Kontrollgruppen (Auszug aus hier)
Kontrollgruppen bieten einen Mechanismus zur Aggregation/Partitionierung von Aufgabengruppen und allen ihren zukünftigen Kindern (child processes/tasks), in hierarchische Gruppen mit spezialisiertem Verhalten.
Definitionen:
Eine cgroup verbindet einen Satz von Aufgaben mit einem Satz von Parametern für ein oder mehrere Teilsysteme. Sie ermöglicht es, mit einer Gruppe von Aufgaben umzugehen.
Ein Subsystem ist in der Regel ein Kernelmodul, das die Möglichkeiten der Aufgabengruppierung nutzt. Ein Subsystem-Mount ist typischerweise ein "Ressourcen-Controller", der eine Ressource einplant oder pro Gruppe Grenzen anwendet.
Eine Hierarchie ist eine Menge von cgroups, die in einem Baum angeordnet sind, so dass jede Aufgabe im System genau einer der cgroups in der Hierarchie angehört, und eine Menge von Subsystemen; jedes Subsystem hat einen systemspezifischen Status, der mit jeder cgroup in der Hierarchie verbunden ist. Jede Hierarchie hat eine Instanz des virtuellen Dateisystems cgroup, die ihr zugeordnet ist.
Code auf Benutzerebene kann cgroups in einer Instanz des virtuellen cgroup-Dateisystems namentlich erstellen und zerstören, angeben und abfragen, welcher cgroup eine Aufgabe zugeordnet ist, und die einer cgroup zugeordneten Aufgaben-PIDs auflisten. Diese Erstellungen und Zuweisungen betreffen nur die mit dieser Instanz des cgroup-Dateisystems verbundene Hierarchie.
Die oberste Ebene der cgroup ist diese:
mount | grep "/sys/fs/cgroup "
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,size=4096k,nr_inodes=1024,mode=755)
Andere cgroups sind die:
mount | grep /sys/fs/cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,size=4096k,nr_inodes=1024,mode=755) cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) cgroup on /sys/fs/cgroup/debug type cgroup (rw,nosuid,nodev,noexec,relatime,debug) cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
CPUSETS (Auszug aus hier)
Der Mechanismus für die Zuweisung eines Satzes von CPUs und Speicherknoten zu einem Satz von Aufgaben wird Cpusets genannt. Ressourcen wie CPU und Speicher können über Cpusets begrenzt werden.
cd /sys/fs/cgroup/cpuset tree
. |-- cgroup.clone_children |-- cgroup.procs |-- cgroup.sane_behavior |-- cpuset.cpu_exclusive |-- cpuset.cpus |-- cpuset.effective_cpus |-- cpuset.effective_mems |-- cpuset.mem_exclusive |-- cpuset.mem_hardwall |-- cpuset.memory_migrate |-- cpuset.memory_pressure |-- cpuset.memory_pressure_enabled |-- cpuset.memory_spread_page |-- cpuset.memory_spread_slab |-- cpuset.mems |-- cpuset.sched_load_balance |-- cpuset.sched_relax_domain_level |-- notify_on_release |-- release_agent `-- tasks
Werfen wir einen Blick auf einige interessante Punkte:
/sys/fs/cgroup/cpuset/cgroup.procs
Liste der Thread-Gruppen-IDs in der cgroup. Es ist nicht garantiert, dass diese Liste sortiert oder frei von doppelten Thread-Gruppen-IDs ist, und der Benutzer sollte die Liste sortieren/vereinheitlichen, wenn diese Eigenschaft erforderlich ist. Das Schreiben einer Thread-Gruppen-ID in diese Datei verschiebt alle Threads in dieser Gruppe in diese cgroup.
Standardmäßig befinden sich alle Thread-Gruppen-IDs in dieser Gruppe:
cat /sys/fs/cgroup/cpuset/cgroup.procs | tail -10
372 376 378 379 403 407 408 409 410 411
/sys/fs/cgroup/cpuset/cpuset.cpus
Liste der CPUs in diesem Cpuset
cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-3
Das bedeutet, dass Aufgaben, die diesem cpuset zugeordnet sind, auf allen 4 CPUs laufen dürfen.
/sys/fs/cgroup/cpuset/cpuset.mems
Liste der Speicherknoten in diesem Cpuset. Der Parameter hat den Wert 0 auf Systemen, die nicht über eine uneinheitliche Speicherarchitektur (NUMA) verfügen.
cat /sys/fs/cgroup/cpuset/cpuset.mems
0
/sys/fs/cgroup/cpuset/tasks
Sie können alle Aufgaben (nach PID) auflisten, die an ein beliebiges cpuset angehängt sind, oder Aufgaben an die cgroup anhängen. Schreiben Sie einfach ihre PID in die Datei /sys/fs/cgroup/cpuset/tasks
für diese cgroup.
cat /sys/fs/cgroup/cpuset/tasks | tail -10
372 376 378 379 403 409 410 411 412 413
Die Prozess- und Task-IDs Ihrer Shell können wie folgt überprüft werden:
ps -L -p $$ -o tid,pid,cpuid,ppid,args
TID PID CPUID PPID COMMAND 234 234 3 1 -sh
Die CPU-Ressourcennutzung ist standardmäßig nicht eingeschränkt (cgroup/cpuset)
Versuchen Sie, die CPU-Last auf alle 4 CPUs zu verteilen.
stress-ng --cpu 4 &
Überwachen Sie die CPU-Auslastung mit htop:
0[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%] Tasks: 26, 1 thr; 4 running 1[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%] Load average: 1.77 0.96 0.45 2[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%] Uptime: 00:08:44 3[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%] Mem[||||||||| 59.2M/990M] Swp[ 0K/0K] PID USER PRI NI VIRT RES SHR S CPU%-MEM% TIME+ Command 284 root 20 0 14988 2692 1388 R 100. 0.3 0:30.47 stress-ng --cpu 4 285 root 20 0 14988 2692 1388 R 100. 0.3 0:30.48 stress-ng --cpu 4 286 root 20 0 14988 2692 1388 R 100. 0.3 0:30.46 stress-ng --cpu 4 287 root 20 0 14988 2692 1388 R 100. 0.3 0:30.08 stress-ng --cpu 4 282 root 20 0 3696 2564 1628 R 1.3 0.3 0:01.72 htop 1 root 20 0 7744 5692 4016 S 0.0 0.6 0:09.93 /sbin/init ...
Wir können sehen, dass alle vier CPUs ziemlich beschäftigt sind.
Beschränkung der CPU-Ressourcennutzung für alle von einer bestimmten Shell aus ausgeführten Aufgaben auf CPU 3
Ein neues cpuset erstellen
mkdir /sys/fs/cgroup/cpuset/set1 tree /sys/fs/cgroup/cpuset/set1
/sys/fs/cgroup/cpuset/set1 |-- cgroup.clone_children |-- cgroup.procs |-- cpuset.cpu_exclusive |-- cpuset.cpus |-- cpuset.effective_cpus |-- cpuset.effective_mems |-- cpuset.mem_exclusive |-- cpuset.mem_hardwall |-- cpuset.memory_migrate |-- cpuset.memory_pressure |-- cpuset.memory_spread_page |-- cpuset.memory_spread_slab |-- cpuset.mems |-- cpuset.sched_load_balance |-- cpuset.sched_relax_domain_level |-- notify_on_release `-- tasks
cgroup.procs
Es sollten noch keine Prozesse im Set enthalten sein:
cat /sys/fs/cgroup/cpuset/set1/cgroup.procs
cpuset.cpus
Beschränken Sie diesen Satz auf CPU 3:
echo 3 > /sys/fs/cgroup/cpuset/set1/cpuset.cpus cat /sys/fs/cgroup/cpuset/set1/cpuset.cpus
3
cpuset.mems
wir haben keine NUMA-Architektur:
echo 0 > /sys/fs/cgroup/cpuset/set1/cpuset.mems cat /sys/fs/cgroup/cpuset/set1/cpuset.mems
0
Aufgaben
tasks: Sie sollten noch nicht im Set enthalten sein:
cat /sys/fs/cgroup/cpuset/set1/tasks
Verbinden Sie die Shell mit dem neuen cpuset
echo $$ > /sys/fs/cgroup/cpuset/set1/tasks cat /sys/fs/cgroup/cpuset/set1/tasks
265 289
ps -L -p 265 -o tid,pid,cpuid,ppid,args
TID PID CPUID PPID COMMAND 265 265 3 264 -sh
Wie Sie sehen können, läuft die Shell auf CPU 3.
Aufbringen der Last aus der Schale
stress-ng --cpu 4 &
Monitor mit htop
0[ 0.0%] Tasks: 26, 1 thr; 4 running 1[|| 1.3%] Load average: 0.89 0.20 0.06 2[ 0.0%] Uptime: 02:01:58 3[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%] Mem[||||||||| 60.8M/990M] Swp[ 0K/0K] PID USER PRI NI VIRT RES SHR S CPU%-MEM% TIME+ Command 310 root 20 0 14988 2960 1400 R 25.0 0.3 0:04.60 stress-ng --cpu 4 311 root 20 0 14988 2960 1400 R 25.0 0.3 0:04.60 stress-ng --cpu 4 312 root 20 0 14988 2956 1400 R 25.0 0.3 0:04.60 stress-ng --cpu 4 313 root 20 0 14988 2952 1400 R 25.0 0.3 0:04.60 stress-ng --cpu 4 314 root 20 0 3696 2584 1652 R 2.0 0.3 0:00.13 htop 1 root 20 0 7744 5708 4020 S 0.0 0.6 0:10.08 /sbin/init ...
Wie Sie sehen können, ist nur CPU 3 beschäftigt.
Überprüfen wir die Prozess- und Task-IDs:
ps -L -p 310 -o tid,pid,cpuid,ppid,args
TID PID CPUID PPID COMMAND 310 310 3 304 stress-ng --cpu 4
ps -L -p 311 -o tid,pid,cpuid,ppid,args
TID PID CPUID PPID COMMAND 311 311 3 304 stress-ng --cpu 4
ps -L -p 312 -o tid,pid,cpuid,ppid,args
TID PID CPUID PPID COMMAND 312 312 3 304 stress-ng --cpu 4
ps -L -p 313 -o tid,pid,cpuid,ppid,args
TID PID CPUID PPID COMMAND 313 313 3 304 stress-ng --cpu 4
Wie Sie sehen können, laufen die vier stress-ng-Instanzen nur auf CPU 3.
Die CPU-Ressourcennutzung ist standardmäßig nicht eingeschränkt (cgroup/cpu)
CPU
Die Funktion cgroups CPU-Subsystem isoliert den CPU-Zeitverbrauch einer Gruppe von Prozessen (Tasks) vom Rest des Systems. Wir können Berichte über die CPU-Nutzung durch die Prozesse in einer cgroup erhalten und Grenzen für die Anzahl der von diesen Prozessen genutzten CPUs festlegen.
tree /sys/fs/cgroup/cpu
/sys/fs/cgroup/cpu |-- cgroup.clone_children |-- cgroup.procs |-- cgroup.sane_behavior |-- cpu.cfs_period_us |-- cpu.cfs_quota_us |-- cpu.rt_period_us |-- cpu.rt_runtime_us |-- cpu.shares |-- cpu.stat |-- cpuacct.stat |-- cpuacct.usage |-- cpuacct.usage_all |-- cpuacct.usage_percpu |-- cpuacct.usage_percpu_sys |-- cpuacct.usage_percpu_user |-- cpuacct.usage_sys |-- cpuacct.usage_user |-- notify_on_release |-- release_agent `-- tasks
cgroup.procs, Aufgaben
Standardmäßig befinden sich alle Thread-Gruppen-IDs in cpu/cgroup.procs. Alle Tasks des Systems sind ebenfalls an cpu/tasks angehängt.
cpu.cfs_period_us
Gibt eine Zeitspanne in Mikrosekunden an, wie regelmäßig der Zugriff einer cgroup auf die CPU-Ressourcen neu zugewiesen werden soll. Gültige Werte sind 1 Sekunde bis 1000 Mikrosekunden.
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
cpu.cfs_quota_us (Auszug von hier)
Cpu.cfs_quota_us gibt die Gesamtzeit in Mikrosekunden an, in der alle Tasks in der Kontrollgruppe ausgeführt werden können.
Sobald Tasks in einer cgroup die durch das Kontingent vorgegebene Zeit ausschöpfen, werden sie gedrosselt.
Ein Wert von -1 für cpu.cfs_quota_us bedeutet, dass für die Gruppe keine Bandbreitenbeschränkung gilt; eine solche Gruppe wird als Gruppe ohne Bandbreitenbeschränkung bezeichnet. Dies entspricht dem traditionellen arbeitserhaltenden Verhalten für CFS (vollständig fairer Scheduler).
Das Schreiben beliebiger (gültiger) positiver Werte führt zum Erreichen der angegebenen Bandbreitengrenze. Die für die Quote oder den Zeitraum zulässige Mindestquote beträgt 1ms. Die Obergrenze für die Periodenlänge beträgt 1s.
Wenn Sie einen negativen Wert in cpu.cfs_quota_us schreiben, wird die Bandbreitenbegrenzung aufgehoben.
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
-1
Beschränkung der CPU-Ressourcennutzung für alle von einer bestimmten Shell aus ausgeführten Aufgaben auf 50 % einer CPU
Neues Set erstellen
mkdir /sys/fs/cgroup/cpu/set1 tree /sys/fs/cgroup/cpu/set1
/sys/fs/cgroup/cpu/set1 |-- cgroup.clone_children |-- cgroup.procs |-- cpu.cfs_period_us |-- cpu.cfs_quota_us |-- cpu.rt_period_us |-- cpu.rt_runtime_us |-- cpu.shares |-- cpu.stat |-- cpuacct.stat |-- cpuacct.usage |-- cpuacct.usage_all |-- cpuacct.usage_percpu |-- cpuacct.usage_percpu_sys |-- cpuacct.usage_percpu_user |-- cpuacct.usage_sys |-- cpuacct.usage_user |-- notify_on_release `-- tasks
cpu.cfs_period_us
cat /sys/fs/cgroup/cpu/set1/cpu.cfs_period_us
100000
cpu.cfs_quota_us
echo 50000 > /sys/fs/cgroup/cpu/set1/cpu.cfs_quota_us cat /sys/fs/cgroup/cpu/set1/cpu.cfs_quota_us
50000
Befestigen Sie eine Schale am Set und belasten Sie das System
echo $$ > /sys/fs/cgroup/cpu/set1/tasks stress-ng --cpu 4 &
CPUs | Ausgelastete CPUs | CPU % ausgelastet | cpu. cfs_period_us | cpu. cfs_quota_us | CPUs wirklich ausgelastet | CPU % wirklich ausgelastet |
---|---|---|---|---|---|---|
4 | 1 | 50 | 100000 | 50000 | 4 | 12,5 im Durchschnitt |
CPU-Nutzung überwachen
0[|||||||||| 10.6%] Tasks: 26, 1 thr; 4 running 1[||||||||||| 12.6%] Load average: 1.15 0.98 0.63 2[||||||||||||| 14.6%] Uptime: 00:52:42 3[||||||||||| 12.6%] Mem[||||||||| 68.7M/990M] Swp[ 0K/0K] PID USER PRI NI VIRT RES SHR S CPU%-MEM% TIME+ Command 319 root 20 0 14988 2692 1388 R 15.2 0.3 1:06.78 stress-ng --cpu 4 318 root 20 0 14988 2692 1388 R 13.2 0.3 1:06.31 stress-ng --cpu 4 321 root 20 0 14988 2692 1388 R 13.2 0.3 1:05.43 stress-ng --cpu 4 320 root 20 0 14988 2692 1388 R 9.9 0.3 0:50.14 stress-ng --cpu 4 316 root 20 0 3696 2576 1708 R 0.7 0.3 0:05.63 htop 1 root 20 0 7772 5808 4128 S 0.0 0.6 0:09.87 /sbin/init
Beschränkung der CPU-Ressourcennutzung für alle von einer bestimmten Shell aus ausgeführten Aufgaben auf 10 % einer CPU
CPUs | Ausgelastete CPUs | CPU % ausgelastet | cpu. cfs_period_us | cpu. cfs_quota_us | CPUs wirklich ausgelastet | CPU % wirklich ausgelastet |
---|---|---|---|---|---|---|
4 | 1 | 10 | 100000 | 10000 | 4 | 2,5 im Durchschnitt |
0[||| 2.6%] Tasks: 26, 1 thr; 4 running 1[||| 2.6%] Load average: 0.15 0.26 0.12 2[|||| 3.3%] Uptime: 00:03:10 3[|| 2.0%] Mem[||||||||| 58.9M/990M] Swp[ 0K/0K] PID USER PRI NI VIRT RES SHR S CPU%-MEM% TIME+ Command 286 root 20 0 14988 2604 1304 R 2.6 0.3 0:00.32 stress-ng --cpu 4 287 root 20 0 14988 2848 1296 R 2.6 0.3 0:00.33 stress-ng --cpu 4 288 root 20 0 14988 2348 1300 R 2.6 0.2 0:00.31 stress-ng --cpu 4 289 root 20 0 14988 2348 1300 R 2.0 0.2 0:00.32 stress-ng --cpu 4 262 root 20 0 3704 2600 1660 R 0.7 0.3 0:00.46 htop 1 root 20 0 7772 5688 4024 S 0.0 0.6 0:09.82 /sbin/init
Beschränkung der CPU-Ressourcennutzung für alle von einer bestimmten Shell aus ausgeführten Aufgaben auf 100 % von zwei CPUs
CPUs | Ausgelastete CPUs | CPU % ausgelastet | cpu. cfs_period_us | cpu. cfs_quota_us | CPUs wirklich ausgelastet | CPU % wirklich ausgelastet |
---|---|---|---|---|---|---|
4 | 2 | 100 | 100000 | 200000 | 4 | 50 im Durchschnitt |
0[||||||||||||||||||||||||||||||||||||||||||| 50.3%] Tasks: 26, 1 thr; 4 running 1[|||||||||||||||||||||||||||||||||||||||||||| 51.0%] Load average: 1.10 0.32 0.11 2[||||||||||||||||||||||||||||||||||||||||||| 50.3%] Uptime: 00:26:35 3[|||||||||||||||||||||||||||||||||||||||||||| 50.6%] Mem[||||||||| 60.9M/990M] Swp[ 0K/0K] PID USER PRI NI VIRT RES SHR S CPU%-MEM% TIME+ Command 300 root 20 0 14988 2952 1388 R 50.2 0.3 0:22.00 stress-ng --cpu 4 297 root 20 0 14988 2940 1388 R 49.6 0.3 0:21.75 stress-ng --cpu 4 298 root 20 0 14988 2948 1388 R 49.6 0.3 0:21.99 stress-ng --cpu 4 299 root 20 0 14988 2948 1388 R 49.6 0.3 0:21.85 stress-ng --cpu 4 271 root 20 0 3692 2636 1704 R 1.3 0.3 0:00.86 htop 1 root 20 0 7740 5768 4096 S 0.0 0.6 0:10.04 /sbin/init ...
Schlussfolgerung
Wie Sie sehen können, sind Kontrollgruppen eine interessante Wahl für die Verwaltung von Systemressourcen. Denken Sie an Anwendungsfälle wie Container und Echtzeit. Wir haben hier fast ausschließlich Low-Level-Kernel-Schnittstellen verwendet. Es gibt definitiv auch High-Level-Wege, um cgroups zu verwalten.
Anhang
Ein Beitrag über "Degrees of real-time" ist hier. Wenn Sie wissen wollen, wie Embedded Linux und Echtzeit-Linux funktionieren, schauen Sie hier nach. Um mehr über das Yocto Project® zu erfahren, schauen Sie hier.