知识库

Linux 内存不足杀手

内存不足杀手(Out Of Memory Killer,简称 OOM Killer)是 Linux 内核在系统内存严重不足时采用的一种进程。出现这种情况是因为 Linux 内核为进程过度分配了内存。

当进程启动时,它会向内核请求一个内存块。这个初始请求通常是一个很大的请求,而进程并不会立即或实际上永远不会完全使用所有内存。内核意识到进程倾向于请求冗余内存,因此会过度分配系统内存。这意味着,例如当系统有 2GB 内存时,内核可能会为进程分配 2.5GB。

通常情况下,这种情况不会引起问题。但是,如果有足够的进程开始使用其请求的所有内存块,那么就没有足够的物理内存来支持所有进程。这意味着正在运行的进程需要的内存比物理可用内存多。这种情况非常危急,必须立即解决。

Linux 内核采用的解决方案是调用 OOM Killer 来检查所有正在运行的进程,并杀死其中一个或多个进程,以释放系统内存并保持系统运行。

OOM Killer 只会在系统内存严重不足时被调用。

由于其特性,Neo4j 总是占用较高的内存,并且在 OOM Killer 清理运行进程时,很可能成为被杀死的对象。虽然被杀死的进程通常看起来是随机的或仅仅是内存占用最高的进程,但 OOM Killer 并不是这样运作的。相反,它根据进程的 oom_score 来选择杀死哪个进程。这是一个由操作系统根据多种标准自行控制的值。

您可以通过查看 /proc/$PID/oom_score 来检查进程的 oom_score

虽然我们不能真正阻止 Neo4j 在需要时被杀死,但我们可以调整其 oom_score,使其进程不太可能被 OOM Killer 终止。为此,您可以编辑以下文件

/proc/$PID/oom_score_adj

/proc 中的文件不是实际文件,它们是操作系统较低层级的接口。因此,您不能使用 nanovi 编辑它们。您可以使用 echo 将值写入文件,如下所示

$echo -100 > /proc/$PID/oom_score_adj

您可以调整此文件中的值,有效值是 -1000 到 1000 范围内的整数。值越低,进程被杀死的可能性越小。

同样,这并不能阻止 Neo4j 被杀死,但会影响其发生的可能性。

请注意,如果进程重新启动,您将不得不再次设置 oom_score_adj。如果您想将其作为更永久的解决方案来实现,建议您在 Neo4j 每次启动时自动调整此值,以适应其新的 PID。

© . All rights reserved.