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

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

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

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 &
CPUsAusgelastete CPUs
CPU %
ausgelastet
cpu.
cfs_period_us
cpu.
cfs_quota_us
CPUs
wirklich ausgelastet
CPU %
wirklich
ausgelastet
415010000050000412,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

CPUsAusgelastete CPUs
CPU %
ausgelastet
cpu.
cfs_period_us
cpu.
cfs_quota_us
CPUs
wirklich ausgelastet
CPU %
wirklich
ausgelastet
41101000001000042,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

CPUsAusgelastete CPUs
CPU %
ausgelastet
cpu.
cfs_period_us
cpu.
cfs_quota_us
CPUs
wirklich ausgelastet
CPU %
wirklich
ausgelastet
42100100000200000450
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.

Unsere 3 Punkte

der Differenzierung

Wir stellen Host- und Zielhardware für alle unsere Kurse zur Verfügung.

Drei oder mehr Personen aus demselben Unternehmen? Wir bieten maßgeschneiderte Privatschulungen an - Beratung inklusive.

Fachexperten entwickeln hochwertige, berufsbezogene, aktuelle und authentische Kursunterlagen.