运行一些带有单个或几个重要系统服务守护进程的 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 工具集的rcctl
shim 进行操作):RCTL集服务名称奥姆保护-500
进一步阅读
- 乔纳森·德博因·波拉德 (2016)。
oom-kill-protect
。诺什工具集。软件。 - 詹姆斯·亨特和克林特·拜鲁姆 (2014)。 ”
oom score
”。 新贵食谱。 - 伦纳特·珀特林 (2013-10-07)。 ”
OOMScoreAdjust
“systemd.exec
..systemd 手册页。freedesktop.org。 - 乔纳森·德博因·波拉德。
rcctl
。诺什工具集。软件。 - https://unix.stackexchange.com/a/409454/5132
答案2
在 Ubuntu 中使用 Upstart 和配置选项可以实现这一点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
器(来自同一包)。