如何调整Linux中的OOM Killer行为
在Linux系统中,当系统的内存资源耗尽时,内核会触发“Out of Memory”(简称OOM)机制来尝试回收内存,通常是通过终止占用大量内存的进程。虽然关闭OOM Killer是不可能的,因为它是内核的一部分,但可以通过调整相关内核参数来改变其行为。本文将介绍两种方法来调整OOM Killer的行为。
方法一:设置特定进程的OOM score adjustment
OOM score adjustment 是一个可以为每个进程设置的值,它会影响该进程被OOM Killer选中的倾向。值越低,进程越不容易被杀掉;值越高,则越容易被杀掉。要使某个进程完全不受OOM Killer的影响,可以将其值设为-1000。
步骤
-
确定进程ID:首先,你需要知道你要保护的进程的PID(进程ID)。可以使用
ps
命令来查找进程ID,例如:ps aux | grep 进程名称
-
设置OOM score adjustment:假设进程的PID是1234,你可以执行以下命令:
echo -1000 > /proc/1234/oom_score_adj
示例
假设我们要保护一个名为 myapp
的进程,其PID为1234,可以执行以下命令:
ps aux | grep myapp
echo -1000 > /proc/1234/oom_score_adj
方法二:调整全局的OOM Killer行为
通过修改 vm.overcommit_memory
和 vm.overcommit_ratio
内核参数,可以调整系统对内存分配的策略,从而减少触发OOM Killer的可能性。
vm.overcommit_memory
参数详解
vm.overcommit_memory
是一个关键的内核参数,用于控制内存分配策略,特别是在应用程序请求的内存超过当前可用物理内存加交换空间总和的情况下。它有三个可能的值,每个值对应不同的内存分配策略:
-
0(默认值):内核会尝试估算应用程序实际需要的内存,并根据这个估算来决定是否允许内存分配。这种模式下,内核会相对保守地处理内存分配请求,尽量避免过度承诺内存,但如果系统负载很高,仍然有可能触发 OOM killer。
-
1:内核总是接受所有内存分配请求,即使这意味着内存用量可能会超过物理内存加交换空间的总和。在这种模式下,只有当实际使用内存时才会发生 OOM killer 的情况。这种方式可以提高某些应用的性能,但同时也增加了系统崩溃的风险。
-
2:内核会严格按照物理内存加交换空间的总和来限制内存分配。如果请求的内存超过了这个总和,内核将拒绝分配。这种方式最为严格,可以防止系统因内存耗尽而崩溃,但可能会导致一些应用由于无法获得足够的内存而失败。
步骤
-
编辑
/etc/sysctl.conf
文件:打开/etc/sysctl.conf
文件,添加或修改以下行:vm.overcommit_memory = 2 vm.overcommit_ratio = 50
vm.overcommit_memory = 2
:内核会严格按照物理内存加交换空间的总和来限制内存分配。如果请求的内存超过了这个总和,内核将拒绝分配。vm.overcommit_ratio = 50
:表示物理RAM加上交换空间的50%。根据你的实际情况调整这个值。
-
使配置生效:保存文件后,运行以下命令使配置生效:
sudo sysctl -p
示例
编辑 /etc/sysctl.conf
文件,添加或修改以下行:
vm.overcommit_memory = 2
vm.overcommit_ratio = 50
保存文件后,运行以下命令使配置生效:
sudo sysctl -p