如何永久设置守护进程的 OOM 杀手调整?

ger*_*ijk 16 linux-kernel daemon out-of-memory

使用单个或几个重要的系统服务守护进程运行一些 Linux 服务器,我想为这些守护进程调整 OOM 杀手,以防发生奇怪的事情。例如,今天一些运行 MySQL 的 Ubuntu 服务器杀死了一个 MySQL 守护进程,因为大量apt-checker进程正在消耗所有内存,内核认为杀死 MySQL 是个好主意。

我知道我可以使用该/proc/$(pidof mysqld)/oom_score_adj文件调整分数来为内核提供一些线索,我不希望 MySQL 被杀死,但这在服务重新启动后无法生存。我应该编辑包中的 init/upstart 脚本以包含这些调整吗?我认为这不是一个非常优雅的解决方案,因为我会对属于一个包的文件进行调整。是否可以在一般情况下连接到 upstart/init 脚本并有条件地调整它?或者你会建议运行一个不确定的脚本while true{ adjust_oom(); sleep 60;}吗?

Jde*_*eBP 12

几个现代守护进程监督系统有这样做的方法。(事实上,由于作业链装载工具,可以说他们对这样的手段。)

  • 新贵:使用oom score在作业文件。
    oom 分数 -500
  • systemd:使用OOMScoreAdjust=服务单元中的设置。您可以使用服务单元补丁文件来影响预先打包的服务单元。
    [服务] 
    OOMScoreAdjust=-500
  • daemontools 系列在服务程序中使用oom-kill-protectnosh 工具集中的工具run

    如果您要转换系统服务单元,该convert-systemd-units工具实际上会将OOMScoreAdjust=设置转换为这样的oom-kill-protect.

    #!/bin/nosh 
    ...
    oom-kill-protect -- -500
    ...
    程序 参数
    作为奖励,您可以使其参数化:
    oom-kill-protect -- fromenv
    并在服务的环境中设置参数的值(假设是从与服务关联的 envdir 中读取的,这里使用 nosh 工具集的rcctl垫片操作):
    rcctl集SERVICENAME oomprotect -500

进一步阅读


ger*_*ijk 9

这在 Ubuntu 中使用 Upstart 和oom score配置选项是可能的。

oom score

Linux 有一个“内存不足”杀手工具。[...]

通常,OOM 杀手对所有进程一视同仁,本节建议内核区别对待这项工作。

提供给本节的“调整”值可以是从 -999(极不可能被 OOM 杀手杀死)到 1000(极有可能被 OOM 杀手杀死)的整数值。[...]

例子:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app
Run Code Online (Sandbox Code Playgroud)