Als systemd-Daemon ausgeführter Prozess weist eine hohe CPU-Auslastung auf

Als systemd-Daemon ausgeführter Prozess weist eine hohe CPU-Auslastung auf

Ich habe eine in C++ kompilierte ausführbare Datei program, die als Hintergrundprozess über systemd ausgeführt werden kann.

Es kann auch als regulärer Prozess über die Befehlszeile ausgeführt werden (wird hauptsächlich zum Debuggen verwendet).

Der Prozess führt reguläre IO-Operationen zwischen anderen Anwendungen und einem externen Gerät durch. Die Gerätekommunikation erfolgt über TCP/IP-Ethernet, während die Anwendungskommunikation vollständig prozessübergreifend erfolgt.

Das Problem besteht darin, dass die Anwendung, wenn sie als eigenständige ausführbare Datei ausgeführt wird, eine CPU-Auslastung von etwa 0,7 % – 1,3 % aufweist.

Wenn dieselbe Anwendung als systemd-Hintergrundprozess ausgeführt wird, steigt die CPU-Auslastung auf ungefähr den CPUQuotain den Konfigurationen zulässigen Höchstwert. In diesem Fall haben wir sie auf 5 % eingestellt.

Warum ist das so? Gibt es etwas, das in systemd passiert und dieses Problem verursacht? Der einzige Unterschied aus Code-Sicht zwischen der Ausführung als Anwendung oder als Daemon besteht darin, dass wir bei der Ausführung als Daemon in bestimmten Abständen einen Heartbeat senden.

Antwort1

Wenden Sie diese Optimierungen an:

1. Ändern Sie Ihren I/O-Scheduler wie gezeigt in mq-deadline:

Stellen Sie sicher, dass dieMQ-Deadline-Schedulerwird beim Start geladen, indem Sie einen Eintrag dafür hinzufügen in /etc/modules-load.d/modules.conf:

echo mq-deadline >> /etc/modules-load.d/modules.conf

Bearbeiten Sie dann /etc/default/grubund stellen Sie sicher, dass der Multiqueue-Deadline-Scheduler aktiviert ist:

GRUB_CMDLINE_LINUX_DEFAULT="scsi_mod.use_blk_mq=1 elevator=mq-deadline"

Wenn Sie fertig sind, geben Sie Folgendes ein:

sudo update-grub

Starten Sie dann neu. Beachten Sie, dassSingle-Queue-Scheduler wurden ab Linux 5.x entfernt.

Das Ziel ist, sicherzustellen, dass CFQ (Completely Fair Queuing) überschrieben wird. Dies kann der Standard-Scheduler Ihrer Linux-Distribution sein, obwohl in letzter Zeit derwie OpenSUSEhaben begonnen, den Multi-Queue-Deadline-Scheduler als Standard festzulegen. Der Hauptvorteil des Multi-Queue-Deadline-Schedulers ist sein sehr geringer CPU-Overhead.

2. Das Wichtigste:Deaktivieren Sie die Autogruppierungsfunktion (die standardmäßig aktiviert ist) und optimieren Sie die Werte der Variable sched_migration_cost /etc/sysctl.conf.

Fügen Sie diese Zeilen ein /etc/sysctl.conf:

kernel.sched_autogroup_enabled=0
kernel.sched_migration_cost_ns = 5000000

Dann ausführen sysctl -pund neu starten.

Ich bin vor einiger Zeit in der Produktion auf ein ähnliches Problem gestoßen, das mit den oben genannten Optimierungen behoben wurde. Die Erklärungen für die verschiedenen Optionen inDasThread waren äußerst nützlich, ebenso wie die Fortsetzung einesähnlicher Fall mit Proxmox.

verwandte Informationen