在编写程序时,有时一个失控的程序会占用我一半的 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) 的调用。
您的示例应该像您想的那样工作(程序在消耗过多 RAM 后被杀死)。我刚刚在我的 shell 服务器上做了一个小测试:
首先,我限制了我的限制非常低:
ulimit -m 10
ulimit -v 10
Run Code Online (Sandbox Code Playgroud)
这导致一切都被杀死。ls,date和其他小命令甚至会在它们开始之前就被射出。
你使用什么 Linux 发行版?你的程序是只使用一个进程还是产生大量的子进程?在后一种情况下,ulimit 可能并不总是有效。
| 归档时间: |
|
| 查看次数: |
14051 次 |
| 最近记录: |