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 CPUQuota
in 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/grub
und 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 -p
und 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.