如何为守护程序永久设置OOM杀手调整?


12

运行一些带有单个或仅有几个重要系统服务守护程序的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;}


有趣的是,有可能进行调整。我想没有什么比无限循环来完成这项工作更好的了。OOM杀手被埋在内核的深处,并且算法非常晦涩。
尼尔斯

Answers:


8

有几种现代的守护程序监控系统可以做到这一点。(事实上,由于作业链装载工具,可以说他们对这样的手段。)

  • 新贵:使用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

进一步阅读

  • 乔纳森·德博因·波拉德(2016)oom-kill-protect。nosh工具集。软件。
  • 詹姆斯·亨特(James Hunt)和克林特·拜鲁姆(Clint Byrum)(2014)。“ oom score”。 新贵菜谱
  • Lennart Poettering(2013-10-07)。“ OOMScoreAdjust”。 systemd.exec。系统手册页。freedesktop.org。
  • 乔纳森·德伯恩·波拉德。rcctl。nosh工具集。软件。
  • /unix//a/409454/5132

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

对于使用Ubuntu 16.04+的读者来说,由于Upstart已被systemd取代,因此它已过时。
gertvdijk

4

您可以将其入侵MySQL本身(例如,OpenSSH sshd这样做),但这有点过于刻板和肮脏(存在更新等问题)。

您可以在包装器或init脚本中执行此操作-分数应该被继承(exec mysqld "$@"无论如何,您都可能希望在包装器中进行评分)。

使用cgroups-它会给您带来更多的灵活性,并且可以永久意义上说,可以在服务重启时自动应用适当的设置。有关更多信息,请参见例如使用cgroup控制应用程序的优先级。为了实现所需的自动功能,您可能需要看一下libcgroup,它包含一个守护程序,该守护程序可以根据一组规则动态处理正在运行的进程的cgroup,或者只使用cgexec包装器(来自同一包)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.