如何限制单个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_DATA
或RLIMIT_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
,看到这个答案 。 除非你是上师,否则不要那样做。