ulimit 不限制内存使用

Lie*_*yan 6 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
Run Code Online (Sandbox Code Playgroud)

但是为什么我的程序仍然使用比给定限制更多的 RAM(是的,我在同一个 bash shell 中启动程序)?

我对 ulimit 有什么误解吗?

小智 7

ulimit -m不再有效。ulimit -v代替使用。

原因是ulimit调用 setrlimit,并且man setrlimit说:

RLIMIT_RSS 指定进程驻留集(RAM 中驻留的虚拟页数)的限制(以字节为单位)。此限制仅在 Linux 2.4.x(x < 30)中有效,并且仅影响对指定 MADV_WILLNEED 的 madvise(2) 的调用。


Jan*_*nen 5

您的示例应该像您想的那样工作(程序在消耗过多 RAM 后被杀死)。我刚刚在我的 shell 服务器上做了一个小测试:

首先,我限制了我的限制非常低:

ulimit -m 10
ulimit -v 10
Run Code Online (Sandbox Code Playgroud)

这导致一切都被杀死。ls,date和其他小命令甚至会在它们开始之前就被射出。

你使用什么 Linux 发行版?你的程序是只使用一个进程还是产生大量的子进程?在后一种情况下,ulimit 可能并不总是有效。