我为我的shell设置了ulimit -m 1000000 ,然后启动了一个消耗大量内存的进程(一个简单的python脚本,从https://unix.stackexchange.com/questions/99334/how-to-fill-90-of免费记忆 )。 我告诉我的Python脚本消耗2G的内存,它似乎这样做(从htop这个输出):
Mem[|||||||||||||||||||||||||||||||||1742/1839MB] Uptime: 137 days(!), 16:56:32 Swp[||||||||||||| 591/2047MB] PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 6207 mikes 20 0 2123M 1625M 156 S 0.0 88.3 0:08.77 python ./consume_memory 2000
看看上面的“RES”列和“MEM”图。
ulimit -a显示:
max memory size (kbytes, -m) 1000000
…为什么我的stream程不能启动? 如果我用ulimit -v 1500000设置我的虚拟内存大小,例如,我的过程按预期失败:
$ ./consume_memory 900 Traceback (most recent call last): File "./consume_memory", line 14, in <module> data = megabyte * count MemoryError
系统规格:
CentOS Linux release 7.2.1511 (Core) Linux hostname 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
在bash中,如果我们执行command -V ulimit我们会发现ulimit is a shell builtin ,所以我们可以help ulimit说
-m the maximum resident set size
所以我们正在设置RSS。 要查看bash实际使用的系统调用,我们可以尝试
$ strace bash -c 'ulimit -m 10000' setrlimit(RLIMIT_RSS, {rlim_cur=10000*1024, rlim_max=10000*1024}) = 0
然后在man setrlimit看来这个
RLIMIT_RSS。 指定进程驻留集的限制(以页为单位)(驻留在RAM中的虚拟页数)。 此限制仅在Linux 2.4.x中有效,x <30,并且仅影响指定MADV_WILLNEED的madvise(2)的调用。
所以现在看起来它在Linux中没有任何作用。