単一プロセスのリソース制限に関する多くの質問と回答があります。たとえば、RLIMIT_ASを使用して、プロセスによって割り当てられた最大メモリを制限できますtop
。このトピックの詳細については、こちらをご覧ください。Unixで特定のプロセスが使用できるメモリ量を制限する方法はありますか?
setrlimit(2)
文書には次のように記載されています。
fork(2)によって生成された子プロセスは、親プロセスのリソース制限を継承します。 execve(2) 全体にわたってリソース制限を予約します。
次のように理解する必要があります。
プロセスのRLIMIT_ASが2 GBの場合、2 GB以上のメモリを割り当てることはできません。子プロセスが作成されると、2 GBのアドレス空間制限が子プロセスに渡されますが、ゼロから計算が開始されます。これら2つのプロセスは合計4 GBのメモリを占有できます。
しかし、プロセスツリー全体に割り当てられるメモリの総量を制限する便利な方法は何ですか?
答え1
これがあなたの質問への答えであるかどうかはわかりませんが、次のものが見つかりました。Perlスクリプトあなたの要件を正確に満たしていると主張してください。このスクリプトは、プロセスとその子のリソース使用量を目覚めさせ、確認して制限を適用する独自のシステムを実装します。よく文書化され説明されているようで、最近更新されました。
slmが彼のコメントで述べたように、cgroupはこの目的にも使用できます。 Linuxを使用しているとし、cgroup管理ユーティリティをインストールする必要があるかもしれませんlibcgroups
。
sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup
$USER
あなたのユーザーであることを確認してください。
これにより、ユーザーはcgroupのメモリ設定にアクセスできます/sys/fs/cgroup/memory/myGroup
。
次に、次のようにして制限を500 MBに設定できます。
echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
それではVimを実行してみましょう:
cgexec -g memory:myGroup vim
vimプロセスとすべての子プロセスは500 MBのRAMしか使用できません。しかし、、私の考えでは、この制限はRAMにのみ適用され、スワップには適用されません。プロセスが制限に達すると、交換が開始されます。この問題を解決できるかどうかはわかりません。 cgroupを使用してスワップの使用を制限する方法が見つかりません。
答え2
https://unix.stackexchange.com/a/536046/4319:
すべてのsystemdベースのディストリビューションでは、systemd-runを介して間接的にcgroupを使用することもできます。たとえば、pdftoppm
RAMを500Mに制限するには、次のようにします。
systemd-run --scope -p MemoryLimit=500M pdftoppm
...
答え3
メモリが制限されたcgroupでターゲットプロセスを実行するには、cgroup-toolsのコマンドを使用してこれを実行するスクリプトを作成しました。バラよりこの回答詳細とスクリプトを学びます。