我花了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 的系统驻留内存(我没有交换文件),大约占整个 1GB 系统内存的 1.8%,但虚拟大小为 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
参数设置虚拟内存大小。真相是什么?
答案1
是的,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),但这仅从 Linux 4.7 开始包含 mmap(2),通常用于大型分配。另一种可能性是限制虚拟内存,但由于 RSS 和 VSZ 之间的差异如此之大,这可能会很困难。
答案2
许多进程与其他进程共享一些内存,例如libc几乎被每个进程使用,但只在内存中映射一次,但它计入每个进程的虚拟内存使用量。可以使用 cgroup 来限制仅由特定进程(主要是 RSS)使用的内存使用量。查看答案如何限制进程及其子进程的总资源(内存)如何做到这一点。这将限制进程及其子进程的总内存。