如何防止 Linux 内存不足时冻结?

如何防止 Linux 内存不足时冻结?

今天我(不小心)在 Linux 机器上运行了一些程序,这些程序很快就占用了大量内存。我的系统死机了,变得没有响应,因此我无法杀死这个罪魁祸首。

我该如何防止将来再发生这种情况?至少不能保持核心或其他东西的响应运行吗?

答案1

我敢打赌,系统实际上并没有“冻结”(内核挂起的意思),而只是反应迟钝。很可能只是交换非常频繁,导致交互性能和系统吞吐量急剧下降。

可以关闭交换,但这只会将问题从性能不佳转变为 OOM 终止进程(以及由此引起的所有问题),同时还会导致由于可用磁盘缓存减少而导致的性能下降。

另外,您可以使用每个进程的资源限制(通常称为rlimit和/或ulimit)来消除单个进程占用大量内存并导致交换的可能性,但这只会将您推入有趣的领域,因为进程会在不方便的时刻死亡,因为它们想要的内存比系统愿意给的要多一点。

如果您知道您将要做的事情可能会导致大量内存使用,那么您可能需要编写一个包装程序,该程序执行mlockall()然后执行您的 shell;这会将其保存在内存中,并且最接近“保持响应核心” (因为问题不在于 CPU 被过度使用)。

就我个人而言,我赞同“不要做傻事”的资源控制方法。如果你拥有 root 权限,你可以对系统造成各种损害,因此任何事物而你不知道其可能产生的结果是一项有风险的业务。

答案2

正如 Tronic 在上文的评论中提到的,可以直接通过键盘组合SysRq-来调用 OOM-killer(内存不足杀手) F

SysRq键通常PrtSc在键盘上的键内组合。

OOM-killer 会终止一些进程,系统会再次响应。默认情况下,可能未启用对 OOM-killer 的直接访问,请检查这个问题了解如何检查其状态和/或启用它。

附言:这对我很有帮助。我同意这个观点,如果该问题是由 Chrome 或任何占用大量内存的软件引起的,那么这是最有用的建议。但您需要记住,OOM-killer 可能会杀死一些非常重要的进程,请谨慎使用它。

答案3

您可以使用类似的守护进程早期检查交换和可用 RAM,您可以配置想要有多少内存可用,包括 RAM 和交换,然后如果达到该阈值,它会杀死最大的内存消耗者,这通常是罪魁祸首,如果您愿意,您还可以有一个例外列表。

答案4

如果你想重新编译内核,你可以尝试修补来自EDIT这个问题的部分:https://stackoverflow.com/q/52067753/10239615
它不会Active(file)在内存压力过大时驱逐页面,因此允许 OOM-killer 几乎立即触发,因为内核不再需要花费数分钟不断地从磁盘重新读取每个进程的可执行代码页,从而导致操作系统冻结。

相关内容