プロセスとそのサブプロセスの合計リソース(メモリ)を制限する方法

プロセスとそのサブプロセスの合計リソース(メモリ)を制限する方法

単一プロセスのリソース制限に関する多くの質問と回答があります。たとえば、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を使用してスワップの使用を制限する方法が見つかりません。

おすすめ記事