これがあなたの質問に答えているかどうかはわかりませんが、探していることを正確に実行すると主張するこの 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 つを強制終了しますが、このコマンドとは関係のないランダムなものは強制終了しません。