如何限制单个Linux进程的内存使用量而不是终止进程。
我知道ulimit可以限制内存使用量,但是如果超过限制,则会终止进程。
是否有任何其他命令或shell可以限制内存使用而不会终止进程?
答案 0 :(得分:5)
除setrlimit之外的另一种方式,可以使用ulimit实用程序设置:
$ ulimit -Sv 500000#设置~500 mb限制
是使用Linux's control groups,因为它限制了一个进程(或一组进程')明显地从虚拟内存分配物理内存。例如:
$ cgcreate -g memory:/ myGroup
$ echo $((500 * 1024 * 1024))> /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
$ echo $((5000 * 1024 * 1024))> /sys/fs/cgroup/memory/myGroupmemory.memsw.limit_in_bytes
将创建一个名为" myGroup"的控制组,将在myGroup下运行的进程集限制为最多500 MB的物理内存和最多5000 MB的交换。要在控制组下运行流程:
$ cgexec -g memory:myGroup COMMAND
注意:对于我能理解的内容,setrlimit会限制虚拟内存,尽管使用cgroup可以限制物理内存。
答案 1 :(得分:4)
我认为你认为用setrlimit(2)设置的限制总是会杀死这个过程是错误的。
实际上,如果超出堆栈空间(RLIMIT_STACK
),该进程将被终止(使用SIGSEGV
)。
但如果它是堆内存(RLIMIT_DATA
或RLIMIT_AS
),则mmap(2)会失败。如果来自malloc(3)或朋友,则malloc
会失败。
某些Linux系统配置了memory overcommit。
这是一个系统管理员问题:echo 0 > /proc/sys/vm/overcommit_memory
故事的寓意是你总是检查malloc
的结果,至少像
struct mystruct_st *ptr = malloc(sizeof(struct mystruct_st));
if (!ptr) { perror("mystruct allocation"); exit(EXIT_FAILURE); }
当然,复杂的应用程序可以处理"内存不足"条件更明智,但很难做到正确。
有些人错误地认为malloc
没有失败(这是错误的)。但这是他们的错误。然后,他们取消引用NULL
指针,获得他们应得的SIGSEGV
。
您可以考虑使用某些处理器特定的代码来捕获SIGSEGV
,请参阅this answer。除非你是一个上师,否则不要这样做。