我有一個 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 類似的情況。