バックグラウンドジョブでファイルを処理するアプリケーションを開発しています。これらのタスクは、各タスクのコマンドを生成するワーカープロセスによって選択されます。タスクマネージャプロセスはシステム単位で実行されます。
特定のファイルは、実行されたコマンドがあまりにも多くのメモリを消費し、システムの残りの部分を使い果たす可能性があります。したがって、生成された各プロセスが消費できるメモリ量を制限したいと思います。単一処理ジョブを終了することは許可されます。
最初は を使ってみましたがうまく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でも動作することをお勧めします。