知识库

Linux 内存不足杀手

内存不足杀手或 OOM Killer 是 Linux 内核在系统内存严重不足时采用的一个进程。这种情况发生是因为 Linux 内核已向其进程过度分配了内存。

当一个进程启动时,它会向内核请求一块内存。此初始请求通常是一个较大的请求,进程不会立即或实际上永远不会使用所有请求的内存。内核意识到进程请求冗余内存的这种趋势,因此会过度分配系统内存。这意味着当系统例如有 2GB 的 RAM 时,内核可能会向进程分配 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。