如何限制单个Linux进程的内存使用量而不是终止进程

时间:2014-11-11 08:45:59

标签: linux ubuntu

如何限制单个Linux进程的内存使用量而不是终止进程。

我知道ulimit可以限制内存使用量,但是如果超过限制,则会终止进程。

是否有任何其他命令或shell可以限制内存使用而不会终止进程?

2 个答案:

答案 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_DATARLIMIT_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。除非你是一个上师,否则不要这样做。