首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何限制应用程序内存的使用?

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

Unix & Linux用户
提问于 2012-02-22 08:40:42
回答 2查看 19.1K关注 0票数 12

我花了两个小时阅读有关这件事的问题,但仍然有一些误解。

我有这样的程序:

代码语言:javascript
复制
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 (我没有交换文件),围绕着整个1GB系统内存的1.8%。虚拟大小是1.39GB?!?我读到过ulimit -m不起作用。人们使用ulimit -v,例如为进程设置虚拟内存。这个虚拟内存是ps列出的VSZ吗?如果我想限制这个进程最多使用100MB系统内存,我应该设置什么值。我已经阅读了setrlimit的文档,这似乎是合理的:

代码语言:javascript
复制
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参数设置虚拟内存大小。真相是什么?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2012-02-22 09:36:37

是的,VSZ是虚拟内存。关于RLIMIT_AS,你在哪里找到上面引用的段落?由于setrlimit(2)是一个Linux系统调用,我不知道它如何能够监视malloc(3),这是一个库函数。相反,它只能与brk(2)、sbrk(2)和mmap(2)一起工作--这也是它的手册(科学Linux检查)的意思。但是,通过这些函数请求的内存总量是虚拟内存,因此RLIMIT_AS确实限制了虚拟内存。(同样,这是按照七限值(2)的规定。)

不幸的是,您不能在Linux下限制RSS (这将是ulimit -m)。您可以尝试ulimit -d (RLIMIT_DATA),但这只会包含mmap(2),因为Linux4.7通常用于大量分配。另一种可能是限制虚拟内存,但是RSS和VSZ之间有这么大的差异,这可能很困难。

票数 6
EN

Unix & Linux用户

发布于 2014-12-18 16:51:11

许多进程与其他进程共享一些内存,例如,几乎每个进程都使用libc,但只能在内存中映射一次,但它计算的是每个进程的虚拟内存使用量。限制仅由特定进程(主要是RSS)使用的内存使用可以使用cgroup。关于如何做到这一点,请参阅如何限制进程及其子进程的总资源(内存)的答案。这将限制进程及其子进程的总内存。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/32368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档