进一步阅读

进一步阅读

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

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

答案1

一些现代守护进程监控系统有办法做到这一点。 (事实上​​,由于有一个链式加载工具可以完成这项工作,可以说它们全部有办法做到这一点。)

  • 暴发户:oom score在作业文件中使用。
    oom分数-500
  • 系统:使用OOMScoreAdjust=服务单元中的设置。您可以使用服务单元补丁文件来影响预打包的服务单元。
    [服务] 
    OOMScoreAdjust=-500
  • 守护进程工具家族:使用服务程序oom-kill-protect中 nosh 工具集中的工具。run

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

    #!/bin/nosh 

    oom-kill-protect -- -500

    程序 论据
    作为奖励,您可以使其参数化:
    oom-kill-protect——fromenv
    并在服务的环境中设置参数的值(假定从与服务关联的 envdir 中读取,此处使用 nosh 工具集的rcctlshim 进行操作):
    RCTL集服务名称奥姆保护-500

进一步阅读

答案2

在 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

答案3

你可以将它侵入 MySQL 本身(例如 OpenSSH 就是sshd这样做的),但这有点太硬核而且非常肮脏(更新等问题)

您可以在包装器或初始化脚本中执行此操作 - 分数应该被继承(并且在包装器中您可能无论如何都想做exec mysqld "$@")。

使用cgroups- 它将给您带来更多的灵活性,并且可以在某种意义上使其永久化,即可以在服务重新启动时自动应用适当的设置。参见例如使用 cgroup 控制应用程序的优先级了解更多信息。为了实现您正在寻找的自动化,您可能需要看看libc组,它包含一个守护程序,可以根据一组规则动态处理正在运行的进程的更改 cgroup,或者仅使用包装cgexec器(来自同一包)。

相关内容