居民设置的尺寸(RSS)的限制没有效果
题
以下问题发生在一台机器上运行Ubuntu的10.04与2.6.32-22的一般性核:设置限制的居民设置的尺寸(RSS)的一个过程似乎不具有任何效果。我目前设置限制在Python与下列代码:
import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000 # this should fail
该列表中,memory_sink,成功的每一个时间。当我检查RSS使用有顶,我可以很容易地得到处使用1gb RAM,这意味着限制是没有工作。做RSS限制不起作用这一核心或发行版?如果有帮助,资源。RLIMIT_NPROC(用户过程的限制)的工作。
解决方案
形成getrlimit手册页:
RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
看来这只是不支持Linux内核2.6。
其他提示
您可以使用 cgroup 来完成此操作。长版本在我的 博客, ,但简短版本(在 Ubuntu 11.04 上测试)是:
安装
cgroup-bin
包裹。编辑
/etc/cgconfig.config
并创建一个内存有限的组。例如,我补充说:group limited { memory { memory.limit_in_bytes = 50M; } }
跑步
$ sudo restart cgconfig $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited $ cgexec -g memory:limited your/program
当我要求它仅使用 50M 时,我用 93M 的 RSS 观察了我的进程,但这对我来说不是问题,因为我的目标只是让程序进行分页。
cgclassify
也可以让您对正在运行的进程附加限制。请注意,对于 RSS,这仅适用于限制生效后分配的内存。
一个相关限制的虚拟存储器或地址空间(RLIMIT_AS)-不会的工作。这种允许的限制python过程和子进程的存储器没有外部工具。
>>> size = 50*1024*1024 # In bytes
>>> resource.setrlimit(resource.RLIMIT_AS, (size, resource.RLIM_INFINITY))
>>> a = 'a' * size
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
从 人页:
RLIMIT_AS.最大尺寸的进程的虚拟存储器(地址空间)字节。
这是一个很好的解释之间的差的居民设置和VM大小 什么是RSS和VSZ在Linux存管理.
我创建了一个脚本来限制的存储器的使用采用cgroups和该管理器,用于临时命令,而不是需要根本的权限。看看 https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894