Linux OOM killer 机制(2)

#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

如果要实验请在测试环境测速,直接对线上环境操作造成任何不良后果请勿怪博主。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/16143.html