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 shell 中启动该程序)?

我是否误解了 ulimit?

答案1

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

首先,我将我的限制限制得非常低:

ulimit -m 10
ulimit -v 10

这导致几乎所有东西都被杀死。lsdate而其他小命令甚至在开始之前就会被射杀。

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

答案2

ulimit -m不再有效。请改用ulimit -v

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

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 命令以适应这些新功能。

相关内容