如何限制应用程序内存使用?


10

我花了2个小时阅读有关此问题的问题,但仍然存在一些误解。

我有这个过程:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

这表明它使用了整个系统内存19.3Mb附近1.8%的系统驻留内存(我没有交换文件)1GB。虚拟大小为1.39GB?!?。我读过那ulimit -m行不通。人们使用ulimit -v例如为该过程设置虚拟内存。这是VSZ列出的虚拟内存ps吗?如果要限制此过程100MB最多使用系统内存,应该设置什么值。我已经阅读了文档setrlimit,这似乎是合法的:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

但是在其他版本的文档中,此RLIMIT_AS参数设置虚拟内存大小。真相是什么?


请注意发布格式。
rozcietrzewiacz 2012年

Answers:


6

是的,VSZ是虚拟内存。关于RLIMIT_AS,您在哪里找到了上面引用的段落?由于setrlimit(2)是Linux系统调用,因此我看不到它如何监视库函数malloc(3)。相反,它只能与brk(2),sbrk(2)和mmap(2)一起使用-这也是其联机帮助页(已检查Scientific Linux的建议)。但是,通过这些功能请求的内存总量虚拟内存,因此RLIMIT_AS实际上限制了虚拟内存。(这再次符合setrlimit(2)联机帮助页。)

不幸的是,您不能在Linux下限制RSS(这是ulimit -m)。您可以尝试ulimit -d(RLIMIT_DATA),但这将忽略mmap(2),通常用于大型分配。另一种可能性是限制虚拟内存,但是RSS和VSZ之间的差异如此之大,这可能很困难。


谢谢您的回答。该段是从setrlimit手册页IEEE/The Open Group 2003 GETRLIMIT(3P)为什么ps能告诉我的RSS,但内核不能在它执行限制?
Dragomir Ivanov

6
根据艾伦·考克斯(Alan Cox)的说法,这是有历史原因的:计算RSS过去很昂贵,因此强制执行此限制会给内核带来很大负担;来源:linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html。另请参见stackoverflow.com/questions/3043709/...
安斯加尔Esztermann

我知道了。我想ulimit -d那时候我会去的。该应用程序是我写的,我没有使用mmap()
Dragomir Ivanov

2
不,您通常不(也不是sbrk()),但是malloc()可能。
Ansgar Esztermann '02

我知道了。那是非常不幸的。因此,此问题的解决方案是cgroups或使用某种脚本语言进行内存使用情况调查。
Dragomir Ivanov

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.