在编写程序时,有时失控程序会占用我一半的 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
这导致几乎所有东西都被杀死。ls
,date
而其他小命令甚至在开始之前就会被射杀。
您使用哪种 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 命令以适应这些新功能。