作為 systemd 守護程式運行的進程具有高 CPU 使用率

作為 systemd 守護程式運行的進程具有高 CPU 使用率

我有一個 C++ 編譯的可執行文件,program可以透過 systemd 作為後台進程運行。

它還可以透過命令列作為常規進程運行(主要用於偵錯)。

該進程在其他應用程式和外部設備之間執行常規 IO 操作。設備通訊透過 TCP/IP 乙太網路進行,而應用程式通訊都是進程間通訊。

問題是,當應用程式作為獨立可執行檔案執行時,CPU 使用率約為 0.7% - 1.3%。

當相同應用程式作為 systemd 背景進程運行時,CPU% 使用率會跳至CPUQuota配置中允許的最大值附近運行。在本例中,我們將其設定為 5%。

為什麼是這樣? systemd 中是否發生了某些事情導致了這個問題?從程式碼角度來看,作為應用程式運行或作為守護程序運行之間的唯一區別是,當作為守護程序運行時,我們以發送的時間間隔發送心跳。

答案1

應用這些調整:

1. 將 I/O 調度程式變更為 mq-deadline,如下所示:

確保mq-截止日期調度程序透過在以下位置新增條目來在啟動時載入/etc/modules-load.d/modules.conf

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

然後編輯/etc/default/grub並確保啟用多隊列截止時間調度程序:

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

完成後,發出:

sudo update-grub

然後重新啟動。注意從 Linux 5.x 開始刪除了單佇列調度程序

這樣做的目標是確保覆蓋 CFQ(完全公平隊列)。這可能是您的 Linux 發行版上的預設調度程序,儘管最近,喜歡 OpenSUSE已開始將多隊列截止時間調度程序設定為預設值。多佇列截止時間調度程序的主要優點是其 CPU 開銷非常低。

2.最重要的是:停用自動分組功能(預設啟用)並調整 sched_migration_cost 變數的值/etc/sysctl.conf

將這些行放入/etc/sysctl.conf

kernel.sched_autogroup_enabled=0
kernel.sched_migration_cost_ns = 5000000

然後運行sysctl -p並重新啟動。

我不久前在生產中遇到了類似的問題,透過上述調整已修復。中各個選項的解釋線程非常有用,後續的內容也是如此與 Proxmox 類似的情況

相關內容