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

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

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

有没有其他的命令或shell可以限制内存使用,而不是杀死进程?

除了setrlimit之外的另一种方法,可以使用ulimit实用工具来设置:

$ ulimit -Sv 500000#设置〜500 MB的限制

是使用Linux的控制组 ,因为它限制了一个进程(或一组进程)与虚拟内存明显分配物理内存。 例如:

$ cgcreate -g内存:/ 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内存:myGroup命令

注意:对于我可以理解的setrlimit会限制虚拟内存,尽管使用cgroup可以限制物理内存。

我认为你错误地认为用setrlimit(2)设置的限制总是会终止进程。

事实上,如果超出堆栈空间( RLIMIT_STACK ),进程将被SIGSEGV (使用SIGSEGV )。

但如果是堆内存( RLIMIT_DATARLIMIT_AS ), mmap(2)将会失败。 如果已经从malloc(3)或者朋友那里调用, malloc将会失败。

一些Linux系统配置了内存过量使用 。
这是一个系统管理员问题: 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 ,看到这个答案 。 除非你是上师,否则不要那样做。