ulimit はメモリ使用量を制限しません

ulimit はメモリ使用量を制限しません

プログラムを作成するときに、暴走したプログラムが RAM の半分を消費し (通常は、大規模なデータ構造を作成するときに実質的に無限ループが原因)、システムが非常に遅くなり、問題のあるプログラムを終了させることさえできなくなることがあります。そこで、プログラムが異常な量のメモリを使用しているときに、ulimit を使用してプログラムを自動的に終了したいと思います。

$ ulimit -a
core file size          (blocks, -c) 1000
data seg size           (kbytes, -d) 10000
scheduling priority             (-e) 0
file size               (blocks, -f) 1000
pending signals                 (-i) 6985
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 10000
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6985
virtual memory          (kbytes, -v) 100000
file locks                      (-x) unlimited
$ ./run_program

しかし、なぜ私のプログラムは指定された制限より多くの RAM を使用しているのでしょうか (はい、同じ bash シェルでプログラムを起動しています)?

ulimit について何か誤解しているのでしょうか?

答え1

あなたの例はあなたが考えているように動作するはずです (プログラムは RAM を大量に消費すると強制終了されます)。私は自分のシェル サーバーで小さなテストを実行しました:

まず、制限を本当に低く設定しました。

ulimit -m 10
ulimit -v 10

これにより、ほぼすべてが殺されlsdate他の小さなコマンドも開始される前に撃たれることになります。

使用している Linux ディストリビューションは何ですか? プログラムは 1 つのプロセスのみを使用しますか、それとも多数の子プロセスを生成しますか? 後者の場合、ulimit が必ずしも効果的であるとは限りません。

答え2

ulimit -m動作しなくなりました。ulimit -v代わりに を使用してください。

その理由は、ulimitsetrlimitを呼び出し、男の制限言う:

RLIMIT_RSS プロセスの常駐セット (RAM に常駐する仮想ページ数) の制限 (バイト単位) を指定します。この制限は Linux 2.4.x、x < 30 でのみ有効であり、MADV_WILLNEED を指定した madvise(2) の呼び出しにのみ影響します。

答え3

これは、.bash_profile に配置しない限り、単一の bash セッションでのみ機能し、すでに実行中のプロセスには適用されません。

私が奇妙だと思うのは、次の点です。

 max memory size         (kbytes, -m) unlimited

/etc/security/limits.conf には存在しませんが、これはプロセスごとのメモリ消費量を制限するものであり、1 つのユーザー アカウント全体を制限するものではありません。Cgroup を追加する代わりに、既存の UNIX コマンドを変更してこれらの新機能に対応させるだけでよかったのです。

関連情報