(システム)サービスの個々のサブプロセスのメモリ消費を制限する方法は?

(システム)サービスの個々のサブプロセスのメモリ消費を制限する方法は?

バックグラウンドジョブでファイルを処理するアプリケーションを開発しています。これらのタスクは、各タスクのコマンドを生成するワーカープロセスによって選択されます。タスクマネージャプロセスはシステム単位で実行されます。

特定のファイルは、実行されたコマンドがあまりにも多くのメモリを消費し、システムの残りの部分を使い果たす可能性があります。したがって、生成された各プロセスが消費できるメモリ量を制限したいと思います。単一処理ジョブを終了することは許可されます。

最初は を使ってみましたがうまくulimit動作しないようです。私が理解しているように、「現代的な」方法はcgroupを使用することです(例:ここ)。実は私が走ったら

systemd-run --user --scope -p MemoryHigh=200M -p MemoryMax=250M MemorySwapMax=0M /path/to/program

入力ファイルによってプログラムがより多くのメモリを割り当てると、プログラムは遅くなり、最終的に終了します。すごい!

これらのメモリ制限をスーパーバイザプロセスのシステム単位ファイルに追加できますが、1つのタスクがRAMを消費しすぎると、すべてのタスクとスーパーバイザが終了します。

systemd-run次に、上記の「ラッパー」を使用して新しいプロセスを生成するようにアプリケーションコードを変更しました。しかしこれは失敗する

バスに接続できません。メディアが見つかりません。

systemd-run --userアクティブなユーザーセッションが必要と思われるため、システムサービス内で権限のないシステムユーザーとして実行されるサービスコンテキストでは使用できないようです。systemd-run --system一方、それは使用に失敗します

一時範囲単位を開始できません。対話型認証が必要です。

むしろ root でサービスを実行するのを避けたい。

それでは、私のサービスによって生成された各サブプロセスのメモリ消費をどのように制限できますか?現在、私はArchでsystemd 251を実行していますが、Ubuntu 20.04または22.04でも動作することをお勧めします。

ベストアンサー1

おすすめ記事