在Linux(CentOS 7.2)上,为什么ulimit -m不会限制内存使用?

我为我的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中没有任何作用。