#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PAGE_SZ (1<<12)
int main(int argc, char* argv[]) {
int i;
if (argc != 2) return 0;
int gb = atoi(argv[1]);
for (i = 0; i < ((unsigned long)gb<<30)/PAGE_SZ ; ++i) {
void *m = malloc(PAGE_SZ);
if (!m)
break;
memset(m, 0, 1);
}
printf("allocated %lu MB\n", ((unsigned long)i*PAGE_SZ)>>20);
getchar();
return 0;
}
然后执行 ./mem 4
如果不执行任何操作的话,直接运行结果会发现系统自动oom掉这个进程
如果我们进行以下操作,把进程优先级设置为-17
pgrep -f "mem" | while read PID; do echo -17 > /proc/$PID/oom_adj;done
你会发现系统不会把这个占用大内存的进程oom掉,但这时你也会发现系统响应变慢甚至宕机!
•设置任意进程触发oom
一个最简单的测试触发OOM的方法,可以把某个进程的oom_adj设置到15(最大值),最容易触发。然后执行以下命令:
echo f > /proc/sysrq-trigger
如果要实验请在测试环境测速,直接对线上环境操作造成任何不良后果请勿怪博主。