繁体   English   中英

Linux OOM杀手不起作用

[英]Linux OOM killer does not work

我想测试内核OOM杀手是否在我的嵌入式Linux上运行良好。 我使用应用程序测试来填充所有内存,看看如果系统在内存不足的情况下运行,OOM是否会终止我的应用程序。

我用过的测试程序:

#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);

}

结果:

我总是得到:

MyApplication triggered out of memory codition (oom killer not called): gfp_mask=0x1200d2, order=0, oomkilladj=0

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

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 PREEMPT

Linux“OOM杀手”是解决过度使用问题的解决方案。

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

为了引起与过度使用相关的问题,你必须在没有写入内容的情况下分配太多内存,然后决定写入所有内存,以便系统发现自己被迫遵守它所做的承诺而没有能力来实现它们。

提供源代码后编辑:

为了完全准确,为了触发过度使用的问题并强制Linux OOM杀手采取行动,你应该有几个进程在第一阶段都使用malloc()保留内存(但是还没有写入它)。 然后让他们全部写入他们同时保留的内存。 这将迫使Linux在任何内存分配之外兑现内存承诺,并且它将别无选择,只能杀死未分配的进程(因为那时它们都不会分配)。

此外,如果您仍想查看OOM杀手如何或何时起作用。 我建议你在while循环之前添加fork() 这将创建许多进程,并最终其中一个OOM杀手将杀死。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM