GNU/Linux >> Linux の 問題 >  >> Linux

プロセスとその子プロセスの総リソース (メモリ) を制限する方法

これがあなたの質問に答えているかどうかはわかりませんが、探していることを正確に実行すると主張するこの perl スクリプトを見つけました。このスクリプトは、プロセスとその子プロセスのリソース使用量を起動してチェックすることにより、制限を適用するための独自のシステムを実装しています。よく文書化され、説明されているようで、最近更新されました.

slm がコメントで述べたように、cgroups もこれに使用できます。 cgroup を管理するためのユーティリティをインストールする必要があるかもしれません。Linux を使用していると仮定すると、libcgroups を探す必要があります。 .

sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup

$USER を確認してください あなたのユーザーです。

その後、ユーザーは /sys/fs/cgroup/memory/myGroup で cgroup メモリ設定にアクセスできるようになります。 .

次に、次のようにして、制限を 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 を使用してスワップの使用を制限する方法が見つかりません。


https://unix.stackexchange.com/a/536046/4319:

systemd ベースのディストリビューションでは、systemd-run を介して間接的に cgroup を使用することもできます。例えば。 pdftoppm を制限する場合 500M の RAM にするには、以下を使用します:

systemd-run --scope -p MemoryLimit=500M pdftoppm

...


Ubuntuで使用されているcgmanagerを使用して、これを行うスクリプトを作成しました。利点の 1 つは、ルート アクセスを必要としないことです。 cgroup 管理は少しディストリビューション固有のものであることに注意してください。したがって、これが systemd cgroup 管理を使用するディストリビューションで機能するかどうかはわかりません。

#!/bin/sh

set -eu

if [ "$#" -lt 2 ]
then
    echo Usage: `basename $0` "<limit> <command>..."
    exit 1
fi

limit="$1"
shift
cgname="limitmem_$$"
echo "limiting memory to $limit (cgroup $cgname) for command [email protected]"

cgm create memory "$cgname" >/dev/null
cgm setvalue memory "$cgname" memory.limit_in_bytes "$limit" >/dev/null
# try also limiting swap usage, but this fails if the system has no swap
cgm setvalue memory "$cgname" memsw.limit_in_bytes "$limit" >/dev/null 2>&1 || true

# spawn subshell to run in the cgroup
set +e
(
set -e
cgm movepid memory "$cgname" `sh -c 'echo $PPID'` > /dev/null
exec "[email protected]"
)
# grab exit code
exitcode=`echo $?`

set -e

echo -n "peak memory used: "
cgm getvalue memory "$cgname" memory.max_usage_in_bytes | tail -1 | cut -f2 -d\"

cgm remove memory "$cgname" >/dev/null
exit $exitcode

使用方法:limitmem として保存 をパスに追加し、実行可能にします。次に実行します。 limitmem 1G command... .これにより、実際に使用されるメモリが制限されます。これに達すると、OOM キラーはプロセスまたはその子の 1 つを強制終了しますが、このコマンドとは関係のないランダムなものは強制終了しません。


Linux
  1. Linux – Oom Killerはどのプロセスを最初に殺すかをどのように決定しますか?

  2. アプリケーションのメモリ使用量を制限するには?

  3. プロセスの pid を取得し、シェル スクリプトで kill -9 を呼び出す方法は?

  1. LinuxでプロセスのCPU使用率を制限する方法

  2. Linux – Linuxシステムでバッファとキャッシュを空にする方法は?

  3. Linuxで1つのプロセスのすべてのスレッド(および子)を解放する方法は?

  1. Centos –プロセスで使用される帯域幅を制限する方法は?

  2. CentOS / RHEL 6 :cgroups を使用して特定のユーザーのメモリ リソースを制限する方法

  3. アプリケーションまたはプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?