如何为其他进程无法使用的进程隔离内存和 cpu?

How to isolate memory and cpu for a process which no other process can use?

提问人:In78 提问时间:11/10/2023 更新时间:11/10/2023 访问量:37

问:

我们有一个主机,其中运行了几个不同的进程,在这个主机上,我们部署了我们的网站。但是,当其他进程开始占用过多内存时,linux OOM 杀手开始杀死进程,它也会杀死我们的 Web 服务器。有没有办法确保某些内存和 cpu 始终可用于某个进程,并且 linux OOM 杀手不会杀死该进程?

基本上,我们可以做些什么来确保网站始终保持正常运行,无论主机上的进程数量是多少?

将内存分配给其他进程在 Linux 中无法使用的进程在此页面中,据说使用虚拟机管理程序可能是一种解决方案,这是处理此类问题的推荐方法吗?另外,docker 可以在这里提供帮助吗?

Linux Docker 虚拟机

评论

1赞 Pablo 11/10/2023
你如何管理你的服务?如果你的服务器有 systemd 支持,那么我会通过 systemd 服务启动你的网站服务,让 systemd 在 OOM 杀手来袭后处理重启。

答:

2赞 Marco Bonelli 11/10/2023 #1

您可以通过 使 OOM 杀手更宽松,或者通过 在给定的进程中完全禁用它。/proc/[pid]/oom_score_adj

文档说明:

在用于确定要终止的任务之前,将值添加到坏分数中。可接受的值范围为 -1000 () 到 +1000 ()。这允许用户空间通过始终偏爱某个任务或完全禁用它来极化对 oom kill 的偏好。可能的最低值 -1000 等同于完全禁用该任务的 oom killing,因为它将始终报告 0 的坏分数。/proc/<pid>/oom_score_adjOOM_SCORE_ADJ_MINOOM_SCORE_ADJ_MAX

因此,在您的情况下,在启动该过程后,找到其 PID 并执行以下操作:

echo -1000 | sudo tee /proc/[PID]/oom_score_adj

这是因为您需要更高的权限来修改,即 。sudo teeoom_score_adjCAP_SYS_RESOURCE

另外,docker 可以在这里提供帮助吗?

不是真的,无论如何都需要在主机中解决问题。将内容放在容器或 PID/用户命名空间中不会影响潜在问题。


旁注:如果内存不足,在某个时候内核将不得不杀死一些东西,如果它不是你的进程,它很可能是其他一些重要的系统组件,会以意想不到的方式使事情崩溃。如果这不起作用,内核甚至可能决定恐慌。因此,为重要进程禁用 OOM 杀手可能会有所帮助,但并不是通用的最终解决方案:这取决于具体情况。

评论

0赞 In78 11/10/2023
我的进程不是罪魁祸首,而是该主机上运行的其他进程有时会占用太多内存。基本上,这个主机被许多人用于不同的需求。
1赞 Marco Bonelli 11/10/2023
@In78 好吧,这很公平。您可能处于系统具有 8G RAM 的情况,您的进程正在使用 5G,而另一个进程使用 3G,但您希望第二个被杀死。
0赞 In78 11/10/2023
是的,基本上我希望我的过程具有更高的优先级。我还在考虑是否可以将 VM 分配给该主机上的每个用户,以便他们的进程仅在其 VM 中运行,而不是在裸机上运行。这样,一个用户的进程就不会干扰另一个用户。
1赞 Marco Bonelli 11/10/2023
@In78是的,这绝对是另一个(更强大的)解决方案。Cgroups 也是限制内存的另一种可能性。