细说|Linux Out Of Memory机制

💡 原文中文,约3900字,阅读约需10分钟。
📝

内容提要

OOM(Out Of Memory)机制是指当系统内存不足时,系统采取的应急措施。Linux内核会尝试回收可回收内存,如页缓存和延迟释放的空闲内存页。如果仍然不足,会触发OOM killer,杀掉占用内存最多的进程。OOM killer通过选择最坏的进程并调用oom_kill_process函数来实现。进程的最坏分数值是通过oom_badness函数计算的,包括进程使用的物理内存和oom_score_adj值。可以通过设置oom_score_adj值为-1000来禁止进程被OOM killer杀掉。

🎯

关键要点

  • OOM机制是指当系统内存不足时,系统采取的应急措施。

  • Linux内核会尝试回收可回收内存,如页缓存和延迟释放的空闲内存页。

  • 如果内存仍然不足,内核会触发OOM killer,杀掉占用内存最多的进程。

  • OOM killer通过选择最坏的进程并调用oom_kill_process函数来实现。

  • 进程的最坏分数值通过oom_badness函数计算,包括物理内存使用和oom_score_adj值。

  • 可以通过设置oom_score_adj值为-1000来禁止进程被OOM killer杀掉。

  • 当进程访问未映射的虚拟内存地址时,会触发缺页异常。

  • 缺页异常处理会申请新的物理内存页并映射虚拟内存地址。

  • 如果物理内存不足,内核会回收文件页缓存或触发swapping机制。

  • swapping机制将不常用的内存页写入交换区以缓解内存不足。

  • 如果以上措施无效,内核会调用pagefault_out_of_memory()函数杀掉占用内存最多的进程。

  • out_of_memory()函数选择最坏的进程并调用oom_kill_process()杀掉它。

  • select_bad_process()函数遍历所有进程,计算最坏分数值以选择目标进程。

  • oom_badness()函数计算进程的最坏分数值,考虑进程的oom_score_adj值和物理内存使用。

  • 通过设置oom_score_adj值为-1000,可以防止重要进程被OOM killer杀掉。

延伸问答

什么是Linux的OOM机制?

OOM机制是指当系统内存不足时,Linux内核采取的应急措施,主要通过回收可回收内存和触发OOM killer来释放内存。

Linux内核如何处理内存不足的情况?

内核首先尝试回收可回收内存,如页缓存和空闲内存页,如果仍然不足,则触发OOM killer,杀掉占用内存最多的进程。

OOM killer是如何选择要杀掉的进程的?

OOM killer通过计算每个进程的最坏分数值,选择占用内存最多的进程进行杀掉,使用的函数包括oom_badness和select_bad_process。

如何防止某个进程被OOM killer杀掉?

可以通过设置进程的oom_score_adj值为-1000来禁止该进程被OOM killer杀掉。

缺页异常是什么?

缺页异常是指当进程访问未映射的虚拟内存地址时,内核会申请新的物理内存页并进行映射。

swapping机制在内存不足时的作用是什么?

swapping机制将不常用的内存页写入交换区,以释放物理内存,从而缓解内存不足的情况。

🏷️

标签

➡️

继续阅读