systemdソケットを使用して高い同時実行を有効にするときの高いCPUとロード

systemdソケットを使用して高い同時実行を有効にするときの高いCPUとロード

rhel9からxinetdを削除しながら、短期サービスのためにsystemdソケットの有効化に切り替えました。ただし、同時実行性が高い場合(実際にはそれほど高くなく最大50個程度)、ホスト負荷とCPU使用率が高くなり、負荷3ではCPU使用率が約95%です。ソケットによって有効になっているすべてのサービスに対して、systemdはそれに対してcgroupを作成し、プロセスの終わりに削除して多くのCPUを消費するようです。この動作を無視する方法はありますか?スライスを作成することは役に立ちません。 xinetdを使用すると、この問題は発生しません。

答え1

systemd はこれに対する cgroup を生成し、プロセスの終わりに削除するので、多くの CPU を消費することになります。この動作を無視する方法はありますか?

いいえ。システムサービストレースはデフォルトでcgroupベースです。

独自の xinetd パッケージを構築することができない場合は、サービスを継承するように移植することをお勧めします。聞く各クライアントソケットの代わりにソケットを使用し、独自のaccept()ループを持ちます(必要な変更量を最小限に抑えるために各クライアントに対して分岐することもできます)。 (x)inetdはまた、このモードを「スタンバイ」モードとしてサポートします。 systemd ではこれを「Accept=no」と呼びます (インスタンス化されていない .service 単位を使用)。

(似ているだけでwhile (fd = accept()) { if (!fork()) handle_client(fd) }十分です。)

関連情報