为什么“ulimit”没有像我期望的那样限制内存使用量?

为什么“ulimit”没有像我期望的那样限制内存使用量?

我正在尝试限制进程的内存使用量

$ulimit -m 2
$/usr/bin/time -l ./myProcess arg1 arg2

进程运行而不会被终止,直到time输出

        7.00 real         4.83 user         2.16 sys
4154855424  maximum resident set size
         0  average shared memory size
         0  average unshared data size
         0  average unshared stack size
   1014384  page reclaims
         0  page faults
         0  swaps
         0  block input operations
         2  block output operations
         0  messages sent
         0  messages received
         0  signals received
         0  voluntary context switches
        15  involuntary context switches

显示尽管使用了命令行,但限制仍被超出ulimit -m 5。我还尝试了选项-v和,-l但它们似乎都没有真正限制内存使用量。我还尝试了以确保它不会看不到子进程的内存使用量。以下是使用 all和之后time的所有限制-m-v-l

$ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) 3
max memory size         (kbytes, -m) 2
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) 2

如果我限制 CPU 时间(ulimit -t 3),那么它可以正常工作并在 3 秒后终止该进程。

问题

我有什么误解吗ulimit -m 5? 我的 ulimit 版本有错误吗?

有没有其他方法可以ulimit限制进程(不一定是 bash 会话)的时间和内存使用量?

版本

我在MAC OSX 10.11.6bash version 3.2.57

相关文章

帖子“ulimit 不限制内存使用”非常相关,但我不认为接受的答案提供任何关于如何解决问题的解决方案

答案1

对于现代 Linux 内核,ulimit每次发布时, 的意义都越来越小。您实际上无法使用,-v因为您的 glibc 版本可能更喜欢使用 加载文件,mmap()因此您必须设置-v足够大以包含进程将要打开的所有文件。因此,该-v标志不能用于限制物理 RAM 的使用。

此外,该-m标志不执行任何操作,因此也不能用于限制物理内存的使用。

如今,人们必须使用cgroups内核接口来限制物理 RAM 的使用,但不幸的是,API 有点难用。也许有一天,我们会有一些类似的进程niceionice它可以限制作为参数给定的进程的内存。

从理论上讲,只要足够近,systemd你应该能够做类似的事情

systemd-run --scope --user -p MemoryMax=250M -- /path/to/program/to/use

它应该会奇迹般地工作。这没有技术原因导致它无法工作(因为底层 Linuxcgroup功能确实支持所需的功能),但有些systemd版本会默默失败,实际上不会限制内存使用量。如果您想推动程序降低内存消耗而不终止它,您还可以-p MemoryHigh=200M在选项中添加类似内容。但请注意,超出范围会使进程速度减慢很多,因为内核将执行额外的工作来从该进程中回收所有内存(包括缓存)以减少内存使用量。在许多情况下,如果您想强制执行最大限制,您就不希望出现这种情况。systemd-runMemoryHigh

相关内容