我花了两个小时阅读有关这件事的问题,但仍然有一些误解。
我有这样的程序:
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的文档,这似乎是合理的:
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参数设置虚拟内存大小。真相是什么?
发布于 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之间有这么大的差异,这可能很困难。
发布于 2014-12-18 16:51:11
许多进程与其他进程共享一些内存,例如,几乎每个进程都使用libc,但只能在内存中映射一次,但它计算的是每个进程的虚拟内存使用量。限制仅由特定进程(主要是RSS)使用的内存使用可以使用cgroup。关于如何做到这一点,请参阅如何限制进程及其子进程的总资源(内存)的答案。这将限制进程及其子进程的总内存。
https://unix.stackexchange.com/questions/32368
复制相似问题