在 Linux(CentOS 7.2)上,为什么 ulimit -m 似乎没有限制内存使用?

在 Linux(CentOS 7.2)上,为什么 ulimit -m 似乎没有限制内存使用?

我已经ulimit -m 1000000为我的 shell 设置了,然后启动了一个消耗大量内存的进程(一个简单的 python 脚本来自https://unix.stackexchange.com/questions/99334/how-to-fill-90-of-the-free-memory)。我告诉我的 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

...为什么我的进程没有启动失败?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)

答案1

在 bash 中,如果我们找到command -V ulimitulimit 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 中没有任何效果。

相关内容