我想测试内核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 / sysctlvm.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
答案 0 :(得分:3)
Linux“OOM杀手”是overcommit problem的解决方案。
如果你只是“填满所有记忆”,那么过度使用就不会出现。 malloc
调用最终将返回一个空指针,该约定表示无法满足内存请求。
为了引起与过度使用相关的问题,您必须分配太多内存而不写入,然后决定写入所有内容,以便系统发现自己被迫遵守承诺它没有能力实现它们。
提供源代码后编辑:
为了完全准确,为了触发过度使用的问题并强制Linux OOM杀手采取行动,你应该有几个进程在第一阶段所有保留内存malloc()
(但不要写它呢)。然后让他们全部写入他们同时保留的内存。这将迫使Linux在任何内存分配之外兑现内存承诺,它将别无选择,只能杀死一个没有分配的进程(因为那时它们都不会分配)。
答案 1 :(得分:0)
此外,如果您仍想查看OOM杀手的工作方式或时间。我建议你在 while 循环之前添加 fork()。这将创建许多进程,最终其中一个OOM杀手会杀死。