首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核在高内存负载下的行为

内核在高内存负载下的行为
EN

Stack Overflow用户
提问于 2012-10-18 01:48:32
回答 1查看 545关注 0票数 1

我在Ubuntu 12.04下观察到了以下行为:

在具有24 be和24个CPU的系统上,如果单个进程获得约12 be的RAM,则属于高内存进程所有者的所有其他进程都会在没有警告的情况下被终止,使用的似乎是SIGKILL,并且允许高内存进程运行直到终止。此外,所有者尝试启动新进程将失败。

这有点麻烦,但我更好奇的是为什么会这样。这可能是内核中资源调度决策的结果。有没有可以找到这方面的文档的地方?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-18 16:51:54

很抱歉回答我自己的问题,但我喜欢有解决方案的记录。由锯末链接的文章包含了我需要的东西。

Linux

  • 内核在耗尽可分配内存时激活内存不足管理器(在内核中为mm/oom_kill.c.c)。OOM管理器
  • 使用一些启发式方法来确定应该终止哪个进程。进程的总运行时间减少了死亡的机会,而分配的内存则增加了死亡的机会。还有其他因素,但对我来说无关紧要。
  • 在选择流程后,OOM会将其发送给SIGTERM。

在我的例子中,除了占用内存的进程之外,所有进程都会被杀死,原因有两个。

  1. 我的进程在它分配内存的区域中忽略了信号。这可能是因为该进程在这段时间内正在积极地接收大量其他信号,和/或因为该进程在剩余的大部分时间内阻塞了I/O。
  2. 占用所有内存的进程通常已经运行了很长时间,累积了几个小时的内存。尽管它的进程数是其他进程的4倍,但它的长运行时间(比其他进程长几百倍)可能会导致对象模型管理器选择首先终止其他进程。

解决方案:

运行

ulimit -v memamount

对于特定用户,将用户可以使用单个进程分配的最大内存量更改为memamount。这会阻止OOM管理器激活。相反,malloc调用将失败,我可以检测到这一点。

2:为SIGTERM编写一个适当清理的处理程序可能会有所帮助,但前提是OOM实际上正在向进程发送SIGTERM,并且该进程忽略或无法接收SIGTERM。

3:在代码中设置内存限制(C):

代码语言:javascript
复制
//resource limit structure with both hard and soft max set to 2GB.
struct rlimit memmax; memmax.rlim_max=0x7FFFFFFF; memmax.rlim_cur = 0x7FFFFFFF;
setrlimit(RLIMIT_MEMLOCK,&memmax); //set maximum virtual memory space to 2GB. 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12940262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档