当机器内存不足时,Linux 是否会终止哪些进程?
它会终止占用最多内存的进程吗?还是终止最新的进程?
答案1
有一些kernel.org 上的信息关于 OOM 如何选择要终止的进程(摘自 Mel Gorman 的书《理解 Linux 虚拟内存管理器》):(请注意,此信息来自 Linux 内核 2.6 版本)
13.3 选择流程
函数
select_bad_process()
负责选择要终止的进程。它通过逐个检查每个正在运行的任务并计算该任务是否适合使用函数 终止来做出决定badness()
。不良程度的计算方法如下,请注意,平方根是使用 计算的整数近似值int_sqrt()
;badness_for_task = total_vm_for_task / (sqrt(cpu_time_in_seconds) * sqrt(sqrt(cpu_time_in_minutes)))
选择该选项是为了选择使用大量内存但寿命不长的进程。运行时间较长的进程不太可能导致内存不足,因此该计算可能会选择使用大量内存但运行时间不长的进程。如果该进程是 root 进程或具有
CAP_SYS_ADMIN
能力,则将分数除以 4,因为假定 root 权限进程表现良好。同样,如果它具有CAP_SYS_RAWIO
能力(访问原始设备)权限,则将分数进一步除以 4,因为不希望终止具有直接访问硬件的进程。
总结一下:OOM 会选择一个符合使用大量内存标准但寿命不长的进程。此外,如果该进程以管理员身份运行root
(或具有管理员权限),则被终止的可能性会降低 4 倍。
就是这样。