Limitation Game: Systemd - CPUQuota
Wenn alles normal läuft, dann läuft alles normal. Aber was ist schon normal. Für die außergewöhnlichen Momente, wie z.B. eine große Last auf dem Server, gibt es schöne Parameter, die man System Daemons mitgeben kann. Eines davon ist CPUQuota=XYZ%
Unter Debian werden die Systemdienste, die mit systemctl start/stop/reload/daemon-reload
usw gesteuert werden unter /etc/systemd/system/
als Dateien gespeichert. Diese sehen dann z.B. so aus (zur Unbrauchbarkeit veränderter ttrss Service)
[Unit]
Description=ttrss_backend
After=network.target mysql.service postgresql.service
[Service]
User=www-dieter
ExecStart=/PFADERSATZ/update_daemon2.php --tasks 3 --intervall 10800 --quiet
StandardOutput=null
CPUQuota=20%
[Install]
WantedBy=multi-user.target
Dieser Dienst mit systemctl start ttrss.service
gestartete Dienst, startet einen Daemon, der alle 10800 Sekunden neue Daten aus dem Netz zieht.
Betrachtung bei einer CPU
Damit der Server sich nicht selbst überlastet, bekommt der Dienst (Service) eine CPU Quota mit (CPUQuota), der dafür sorgt, dass die CPU relativ, also in in Abhängigkeit der gerade stattfindenden CPU Nutzung, nicht mehr als 20% der CPU genutzt werden.
In der Realität sieht das mit CPUQuota=20% so aus:
CPU wird gerade zu 0% genutzt = ttrss bekommt 20% der CPU
CPU wird gerade zu 90% genutzt = ttrss bekommt 10% der CPU
CPU wird gerade zu 70% genutzt = ttrss bekommt 20% der CPU
CPU wird gerade zu 85% genutzt = ttrss bekommt 15% der CPU
Multi CPU System
Sind mehr CPUs in einem System gilt für jede CPU 100%. Das bedeutet
1 CPU = 100% verfügbar
2 CPUs = 200%
3 CPUs = 300%
Setzt mal also bei 3 CPUs CPUQuota=144% bekommt der Dienst auch 144% der CPUs (falls verfügbar). Wenn weniger CPU Power zur Verfügung steht, dann natürlich auch weniger.
Ich bin mir nicht sicher, aber es sieht bei einer oberflächlichen Betrachtung aus, als würden mehrere Threads eines solchen Services auch auf mehrere CPUs verteilt werden, aber dennoch mit dem Limit 20% über alle CPUs. Was ja auch eine schöne Sache ist.
Wird CPUQuota=0 gesetzt, wird diese Funktion deaktiviert.
Auszug aus der Definition
zu finden mit dem Konsolenbefehl man systemd.resource-control
Assign the specified CPU time quota to the processes executed. Takes a percentage value, suffixed with “%". The percentage specifies how much CPU time the unit shall get at maximum, relative to the total CPU time available on one CPU. Use values > 100% for allotting CPU time on more than one CPU. This controls the “cpu.max” attribute on the unified control group hierarchy and “cpu.cfs_quota_us” on legacy. For details about these control group attributes, see Control Groups v2[2] and CFS Bandwidth Control[4]. Setting CPUQuota= to an empty value unsets the quota.
Example: CPUQuota=20% ensures that the executed processes will never get more than 20% CPU time on one CPU.