我正在尝试限制进程的内存使用量
$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.6
和bash version 3.2.57
。
相关文章
帖子“ulimit 不限制内存使用”非常相关,但我不认为接受的答案提供任何关于如何解决问题的解决方案
答案1
对于现代 Linux 内核,ulimit
每次发布时, 的意义都越来越小。您实际上无法使用,-v
因为您的 glibc 版本可能更喜欢使用 加载文件,mmap()
因此您必须设置-v
足够大以包含进程将要打开的所有文件。因此,该-v
标志不能用于限制物理 RAM 的使用。
此外,该-m
标志不执行任何操作,因此也不能用于限制物理内存的使用。
如今,人们必须使用cgroups
内核接口来限制物理 RAM 的使用,但不幸的是,API 有点难用。也许有一天,我们会有一些类似的进程nice
,ionice
它可以限制作为参数给定的进程的内存。
从理论上讲,只要足够近,systemd
你应该能够做类似的事情
systemd-run --scope --user -p MemoryMax=250M -- /path/to/program/to/use
它应该会奇迹般地工作。这没有技术原因导致它无法工作(因为底层 Linuxcgroup
功能确实支持所需的功能),但有些systemd
版本会默默失败,实际上不会限制内存使用量。如果您想推动程序降低内存消耗而不终止它,您还可以-p MemoryHigh=200M
在选项中添加类似内容。但请注意,超出范围会使进程速度减慢很多,因为内核将执行额外的工作来从该进程中回收所有内存(包括缓存)以减少内存使用量。在许多情况下,如果您想强制执行最大限制,您就不希望出现这种情况。systemd-run
MemoryHigh