首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux杀手不起作用

Linux杀手不起作用
EN

Stack Overflow用户
提问于 2014-11-13 10:55:52
回答 2查看 2.9K关注 0票数 1

我想测试内核OOM杀手在我的嵌入式Linux上是否正常工作。我使用一个应用程序测试来填充所有内存,并查看如果系统内存不足,OOM是否会杀死我的应用程序。

我使用的测试程序:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

#define MEGABYTE 1024*1024

int main(int argc, char *argv[])
{
        void *myblock = NULL;
        int count = 0;

        while(1)
        {
                myblock = (void *) malloc(MEGABYTE);
                if (!myblock) break;
                memset(myblock,1, MEGABYTE);
                printf("Currently allocating %d MB\n",++count);

        }
        exit(0);

}

结果:

我总是得到:

代码语言:javascript
复制
MyApplication triggered out of memory codition (oom killer not called): gfp_mask=0x1200d2, order=0, oomkilladj=0

我试图通过添加以下内容更改/etc/sysctl:

代码语言:javascript
复制
vm.oom_kill_allocating_task=1
vm.panic_on_oom=0
vm.overcommit_memory=0
how can I make OOM works fine on my system 

内核版本:2.6.30 #7 SMP抢占

EN

回答 2

Stack Overflow用户

发布于 2014-11-13 11:07:28

Linux“OOM杀手”是超额承诺问题的解决方案。

如果你只是“填满所有的记忆”,那么过多的承诺就不会出现。malloc调用最终将返回一个空指针,即表示内存请求无法满足的约定。

为了造成与过度提交相关的问题,您必须在没有写入的情况下分配过多的内存,然后决定将其写到所有内存中,以便系统发现自己不得不履行它所做的承诺,而没有能力履行这些承诺。

提供源代码后的编辑:

确切地说,为了触发过度提交问题并迫使Linux杀手采取行动,您应该有几个进程在第一阶段使用malloc()保留内存(但尚未写入)。然后让所有的人同时写到他们保留的记忆中。这将迫使Linux遵守任何内存分配之外的内存承诺,并且它将别无选择,只能杀死一个没有分配的进程(因为此时它们都不会分配)。

票数 3
EN

Stack Overflow用户

发布于 2014-11-13 14:39:34

另外,如果你还想看看OOM杀手是如何或何时起作用的.我建议您在循环之前添加叉()。这将创造许多进程,并最终其中一个OOM杀手将杀死。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26907230

复制
相关文章

相似问题

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