Cgroups with systemd: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 9: Zeile 9:
 
=Servicedateien bearbeiten=
 
=Servicedateien bearbeiten=
 
*Lassen Sie uns die Unit-Datei selbst bearbeiten.
 
*Lassen Sie uns die Unit-Datei selbst bearbeiten.
*Dazu habe ich eine sehr einfache Unit-Datei erstellt, die ein Skript ausführt:
+
*Die maximale CPU-Auslastung soll begrenzt werden
==Unit Datei==
+
*einmal 20% und einmal 40%
*/etc/systemd/system/generate-load.service
+
==Unit Dateien==
 +
*cat /etc/systemd/system/gen-load-20.service
 
<pre>
 
<pre>
 +
[Unit]
 +
Description=CPU usage limiting test
 +
 
[Service]
 
[Service]
 
Type=oneshot
 
Type=oneshot
Zeile 19: Zeile 23:
 
StandardOutput=tty
 
StandardOutput=tty
 
RemainAfterExit=yes
 
RemainAfterExit=yes
 +
CPUQuota=20%
  
 
[Install]
 
[Install]
WantedBy=multi-user.target
+
WantedBy=default.target
 +
</pre>
 +
 
 +
*cat /etc/systemd/system/gen-load-40.service
 +
<pre>
 +
[Unit]
 +
Description=CPU usage limiting test
 +
 
 +
[Service]
 +
Type=oneshot
 +
ExecStart=/usr/local/bin/generate_load.sh
 +
TimeoutSec=0
 +
StandardOutput=tty
 +
RemainAfterExit=yes
 +
CPUQuota=40%
 +
 
 +
[Install]
 +
WantedBy=default.target
 
</pre>
 
</pre>
 
==Das Skript==
 
==Das Skript==
 
*cat /usr/local/bin/generate_load.sh
 
*cat /usr/local/bin/generate_load.sh
 +
 
  #!/bin/bash
 
  #!/bin/bash
 
  /usr/bin/cat /dev/urandom > /dev/null &
 
  /usr/bin/cat /dev/urandom > /dev/null &
  
 
=Starten des Dienstes=
 
=Starten des Dienstes=
*systemcl start generate-load.service
+
*systemcl start gen-load-20.service
*systemd-cgls
+
*systemcl start gen-load-40.service
 +
*systemd-cgtop
 +
 
 +
=Status=
 +
*systemd-cgtop
 
<pre>
 
<pre>
Control group /:
+
Control Group                      Tasks  %CPU  Memory  Input/s Output/s
...
+
/                                    108  66.6  816.5M        -        -
└─system.slice  
+
system.slice                         17   62.5    80.2M        -       -
  ├─prog.service
+
system.slice/gen-load-40.service       1   '''41.9'''   300.0K        -       -
   │ └─47462 netcat -lp 99 -s 127.0.0.1
+
system.slice/gen-load-20.service       1   '''20.4'''  300.0K        -        -
  ├─systemd-udevd.service
 
  │ └─212 /lib/systemd/systemd-udevd
 
  ├─cron.service
 
  │ └─296 /usr/sbin/cron -f
 
  ├─systemd-journald.service  
 
   │ └─192 /lib/systemd/systemd-journald
 
   ├─ssh.service
 
  │ └─410 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
 
  ├─rsyslog.service
 
  │ └─303 /usr/sbin/rsyslogd -n -iNONE
 
  ├─generate-load.service  
 
   │ └─50387 /usr/bin/cat /dev/urandom
 
...  
 
 
</pre>
 
</pre>
=Eigner Slice=
 
*Was passiert, wenn ich der systemd-Dienstdatei die folgende Zeile hinzufüge?
 
Slice=my-beautiful.slice
 
*Die Ausgabe von systemd-cgls zeigt etwas Merkwürdiges. Der generate-load.service ist nun tief verschachtelt:
 
*systemd-cgls
 
<pre>
 
Control group /:
 
-.slice
 
├─my.slice
 
│ └─my-beautiful.slice
 
│  └─my-beautiful.slice
 
│    └─generate-load.service
 
│      └─53737 /usr/bin/cat /dev/urandom
 
</pre>
 
*Warum ist das? Die Antwort hat damit zu tun, wie systemd verschachtelte cgroups interpretiert.
 
*Kinder werden folgendermaßen deklariert: -.slice. Da systemd versucht, hilfreich zu sein, wenn ein übergeordnetes Element nicht existiert, erstellt systemd es für Sie.
 
*Wenn ich Unterstriche _ anstelle von Bindestrichen verwendet hätte, wäre das Ergebnis so gewesen, wie Sie es erwartet hätten:
 
 
=Verwendung von Drop-in-Dateien=
 
*Drop-in-Dateien für systemd sind ziemlich einfach einzurichten.
 
*Erstellen Sie zunächst ein geeignetes Verzeichnis basierend auf dem Namen Ihres Dienstes in /etc/systemd/system.
 
*Führen Sie im cat-Beispiel den folgenden Befehl aus:
 
* mkdir -p /etc/systemd/system/generate-load.service.d/
 
*Diese Dateien können beliebig organisiert werden.
 
*Sie werden basierend auf der numerischen Reihenfolge ausgeführt, daher sollten Sie Ihre Konfigurationsdateien etwa 10-CPUSettings.conf benennen.
 
*Alle Dateien in diesem Verzeichnis sollten die Dateierweiterung .conf haben und erfordern, dass Sie jedes Mal, wenn Sie eine dieser Dateien anpassen, systemctl daemon-reload ausführen.
 
 
*Ich habe zwei Drop-In-Dateien erstellt, um zu zeigen, wie Sie verschiedene Konfigurationen aufteilen können.
 
*Die erste ist 00-slice.conf. Wie unten zu sehen ist, richtet es die Standardoptionen für ein separates Slice für den cat-Dienst ein:
 
[Service]
 
Slice=AWESOME.slice
 
MemoryAccounting=yes
 
CPUAccounting=yes
 
  
*The other file sets the number of CPUShares, and it's called 10-CPUSettings.conf.
 
[Service]
 
CPUShares=256
 
 
=Links=
 
=Links=
 
*https://www.redhat.com/sysadmin/cgroups-part-four
 
*https://www.redhat.com/sysadmin/cgroups-part-four

Version vom 11. Januar 2023, 14:32 Uhr

  • Standardmäßig erstellt systemd eine neue cgroup unter system.slice für jeden Dienst, den es überwacht.
  • Das ausführen von systemd-cgls zeigt die folgenden Dienste unter system.slice (die Ausgabe ist der Kürze halber abgeschnitten):
  • Sie können dieses Verhalten ändern, indem Sie die systemd-Dienstdatei bearbeiten.
  • Es gibt drei Optionen in Bezug auf die cgroup-Verwaltung mit systemd:
    • Bearbeiten der Servicedatei selbst.
    • Verwendung von Drop-in-Dateien.
    • Verwenden von systemctl set-property-Befehlen, die mit dem manuellen Bearbeiten der Dateien identisch sind, aber systemctl erstellt die erforderlichen Einträge für Sie.

Auf diese gehe ich weiter unten näher ein.

Servicedateien bearbeiten

  • Lassen Sie uns die Unit-Datei selbst bearbeiten.
  • Die maximale CPU-Auslastung soll begrenzt werden
  • einmal 20% und einmal 40%

Unit Dateien

  • cat /etc/systemd/system/gen-load-20.service
[Unit]
Description=CPU usage limiting test

[Service]
Type=oneshot
ExecStart=/usr/local/bin/generate_load.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
CPUQuota=20%

[Install]
WantedBy=default.target
  • cat /etc/systemd/system/gen-load-40.service
[Unit]
Description=CPU usage limiting test

[Service]
Type=oneshot
ExecStart=/usr/local/bin/generate_load.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
CPUQuota=40%

[Install]
WantedBy=default.target

Das Skript

  • cat /usr/local/bin/generate_load.sh
#!/bin/bash
/usr/bin/cat /dev/urandom > /dev/null &

Starten des Dienstes

  • systemcl start gen-load-20.service
  • systemcl start gen-load-40.service
  • systemd-cgtop

Status

  • systemd-cgtop
Control Group                      Tasks   %CPU   Memory  Input/s Output/s
/                                    108   66.6   816.5M        -        -
system.slice                          17   62.5    80.2M        -        -
system.slice/gen-load-40.service       1   '''41.9'''   300.0K        -        -
system.slice/gen-load-20.service       1   '''20.4'''   300.0K        -        -

Links