有没有办法配置 Linux,使得 OOM 终止程序仅报告/发布被终止的进程,但不转储整个机器状态?
我之所以问这个问题,是因为在我们的生产系统中,我们的一些客户运行他们的工作负载。一些进程的 OOM 终止会导致日志文件膨胀 - 因此导致操作系统磁盘上出现大量 IO,并且系统变得不稳定且难以交互。
我们花了很多时间在谷歌上搜索这个问题,但我们主要发现如何调整进程的 OOM 分数(进程的优先级),但没有找到如何调整 OOM 杀手的日志记录级别。
谢谢你的时间!
答案1
并且某些进程的 OOM 终止会导致日志文件膨胀 - 从而导致操作系统磁盘上出现大量 IO,并且系统变得不稳定且难以交互。
不!
您的系统内存不足,严重到触发 OOM killer。那是什么让你的系统不稳定。
您误解了因果关系。
恕我直言,如果内存不足杀手需要频繁运行,那应该是您需要解决的实际问题。
除非您的系统真的很大,或者小到可笑,否则生成和存储由 OoM-killer 生成的任务转储应该不是什么真正的问题。
但是在大型系统上,您可以设置内核可调参数vm.oom_dump_tasks
来0 禁用任务转储。
看https://www.kernel.org/doc/Documentation/sysctl/vm.txt
oom_dump_tasks
当内核执行 OOM 终止时,启用生成系统范围的任务转储(不包括内核线程),并包含诸如 pid、uid、tgid、vm 大小、rss、pgtables_bytes、swapents、oom_score_adj 分数和名称之类的信息。这有助于确定调用 OOM 终止程序的原因、识别导致此问题的恶意任务以及确定 OOM 终止程序选择终止该任务的原因。
如果将其设置为零,则此信息将被抑制。在包含数千个任务的大型系统中,可能无法转储每个任务的内存状态信息。当可能不需要这些信息时,不应强迫此类系统在 OOM 条件下承受性能损失。
如果将其设置为非零,则每当 OOM 终止程序实际终止占用大量内存的任务时,就会显示此信息。
默认值为
1
(启用)。