2024年11月Linux如何使用OOM killer 机制?(2)

发布时间:

  ⑴OOM Killer计算分数

  ⑵. 首先,计算分数时是以进程的大小为基准的,虚拟内存大小可以使用ps命令的VSZ或/proc/《PID》/status的 VmSize来确认。对于正在消耗虚拟内存的进程,其最初的得分较高,单位是将KB作为个得分,消耗GB内存的进程,得分约为*。

  ⑶.如果进程正在执行swapoff系统调用,则得分设置为最大值(unsigned long的最大值。这是因为禁用swap的行为与消除内存不足是相反的,会立刻将其作为OOM Killer的对象进程。

  ⑷.如果是母进程,则将所有子进程内存大小的一半作为分数。

  ⑸. 根据进程的CPU使用时间和进程启动时间调整得分,这是因为在这里认为越是长时间运行或从事越多工作的进程越重要,需保持得分较低。

  ⑹.对于通过nice命令等将优先级设置得较低的进程,要将得分翻倍。nice-n中设置为~的命令的得分翻倍。

  ⑺.特权进程普遍较为重要,因此将其得分设置为/。

  ⑻.通过capset(等设置了功能(capabilityCAP_SYS_RAWIO注的进程,其得分为/,将直接对硬件进行操作的进程判断为重要进程。

  ⑼.关于Cgroup,如果进程只允许与促使OOM Killer运行的进程所允许的内存节点完全不同的内存节点,则其得分为/。

  ⑽.最后通过proc文件系统oom_adj的值调整得分。

  ⑾依据以上规则,为所有进程打分,向得分最高的进程发送信号SIGKILL(到Linux ..为止,在设置了功能CAP_SYS_RAWIO的情况下,发送SIGTERM,在没有设置的情况下,发送SIGKILL。

  ⑿各进程的得分可以使用/proc/《PID》/oom_score来确认。

  ⒀但是init(PID为的进程不能成为OOM Killer的对象。当成为对象的进程包含子进程时,先向其子进程发送信号。

  ⒁向成为对象的进程发送信号后,对于引用系统的全线程,即使线程组(TGID不同,如果存在与对象进程共享相同内存空间的进程,则也向这些进程发送信号。

  ⒂至于为什么用-而不用其他数值(默认值为,这个是由linux内核定义的,查看内核源码可知:

  ⒃以linux- ..版本的kernel源码为例,路径为linux-../include/linux/oom.h,阅读内核源码可知oom_adj的可调 值为到-,其中最大-最小,-为禁止使用OOM。oom_score为的n次方计算出来的,其中n就是进程的oom_adj值,所 以oom_score的分数越高就越会被内核优先杀掉。

  ⒄当然还可以通过修改内核参数禁止OOM机制

  ⒅# sysctl -w vm.panic_on_oom=

  ⒆vm.panic_on_oom = //表示关闭,默认为表示开启OOM

  ⒇# sysctl -p

  ⒈命令行参数输入占用内存大小N,根据自身实验环境的物理内存大小来设置,例如我的实验环境为内存G,设为G就足够了

  ⒉代码命名为mem.c,编译方法 g -o mem mem.c

  ⒊#include 《stdio.h》

  ⒋#include 《stdlib.h》

  ⒌#include 《string.h》

  ⒍#define PAGE_SZ (《《

  ⒎int main(int argc, char* argv[] {

  ⒏if (argc != return ;

  ⒐int gb = atoi(argv[];

  ⒑for (i = ; i 《 ((unsigned longgb《《/PAGE_SZ ; ++i {

  ⒒void *m = malloc(PAGE_SZ;

  ⒓memset(m, , ;

  ⒔printf(“allocated %lu MB

  ⒕”, ((unsigned longi*PAGE_SZ》》;

  ⒖getchar(;

  ⒗return ;

  ⒘然后执行 。/mem

  ⒙如果不执行任何操作的话,直接运行结果会发现系统自动oom掉这个进程

  ⒚如果我们进行以下操作,把进程优先级设置为-

  ⒛pgrep -f “mem” | while read PID; do echo - 》 /proc/$PID/oom_adj;done

  ①你会发现系统不会把这个占用大内存的进程oom掉,但这时你也会发现系统响应变慢甚至宕机!

  ②设置任意进程触发oom

  ③一个最简单的测试触发OOM的方法,可以把某个进程的oom_adj设置到(最大值,最容易触发。然后执行以下命令:

  ④echo f 》 /proc/sysrq-trigger

  ⑤以上就是Linux如何使用OOM killer 机制,Linux强制杀死进程就不会出现死机或者中毒的现象,这是Linux一大优点。