Linux 内存不足杀手(OOM Killer)
内存不足杀手(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 中的文件并非真实文件,它们是操作系统底层的接口。因此不能使用
|
可以在该文件上调整数值,合法值为 -1000 到 1000 之间的整数。数值越低,被杀的可能性越小。
再次说明,这并不能阻止 Neo4j 被杀,但会影响其发生的概率。
请注意,如果进程重新启动,需要再次设置 oom_score_adj。如果想要更永久的解决方案,建议在 Neo4j 启动时(针对其新 PID)自动执行此调整。
此页面有帮助吗?