我在Ubuntu 12.04下观察到了以下行为:
在具有24 be和24个CPU的系统上,如果单个进程获得约12 be的RAM,则属于高内存进程所有者的所有其他进程都会在没有警告的情况下被终止,使用的似乎是SIGKILL,并且允许高内存进程运行直到终止。此外,所有者尝试启动新进程将失败。
这有点麻烦,但我更好奇的是为什么会这样。这可能是内核中资源调度决策的结果。有没有可以找到这方面的文档的地方?
发布于 2012-10-18 16:51:54
很抱歉回答我自己的问题,但我喜欢有解决方案的记录。由锯末链接的文章包含了我需要的东西。
Linux
在我的例子中,除了占用内存的进程之外,所有进程都会被杀死,原因有两个。
解决方案:
运行
ulimit -v memamount
对于特定用户,将用户可以使用单个进程分配的最大内存量更改为memamount。这会阻止OOM管理器激活。相反,malloc调用将失败,我可以检测到这一点。
2:为SIGTERM编写一个适当清理的处理程序可能会有所帮助,但前提是OOM实际上正在向进程发送SIGTERM,并且该进程忽略或无法接收SIGTERM。
3:在代码中设置内存限制(C):
//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. https://stackoverflow.com/questions/12940262
复制相似问题