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-deadline スケジューラ起動時にロードするには、次のエントリを追加します/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(Completely Fair Queuing)がオーバーライドされることを保証することです。これは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の類似事例

関連情報