Linux 内核在内存分配方面提供了一定程度的灵活性。 sysctl 参数 vm.overcommit_memory 控制内核如何处理进程请求的内存多于物理可用内存的情况。当设置为 0 或 1 时,内核允许“过度使用”——实质上允许程序分配比现有内存更多的内存。如果分配的内存被充分利用,这可能会导致严重情况,因为系统可能会耗尽物理资源。

过度使用和内存耗尽

当内存耗尽时,整个系统的稳定性就会受到威胁。进程可能崩溃,基本服务可能失败,整体性能将急剧下降。为了防止这种情况发生,Linux 内核采用了一种称为内存不足 (OOM) Killer 的机制。

OOM Killer 的决策过程

OOM Killer 的主要作用是有选择地终止进程以释放足够的内存供系统运行。  挑战在于选择要杀死的“最佳”进程——能够释放最多内存同时造成最小干扰的进程。

OOM 分数:为了做出此决定,内核为每个进程分配一个 oom_score。该分数可以在进程 ID 目录中的 /proc 文件系统下查看。 oom_score 越高,进程在 OOM 情况下被终止的可能性就越大。

计算 OOM 分数:在现代 Linux 内核中,oom_score 被计算为进程正在使用的可用内存的简单百分比。

  1. 如果整个系统内存不足,“可用内存”是 RAM 和交换空间的总和。
  2. 如果短缺发生在特定控制组 (cgroup) 内,则“可用内存”是分配给该 cgroup 的数量。
  3. 评分细微差别:计算结果的数字介于 0(不使用内存)和 1000(使用所有可用内存)之间。有一些细微的调整:
  4. 根拥有的进程的得分略有下降,因为它们通常被认为更重要。
  5. 可以添加 oom_score_adj 变量(可通过 /proc 调整),从而允许用户影响进程对 OOM Killer 的吸引力。

影响和注意事项

了解 OOM Killer 的行为对于系统管理员和开发人员至关重要。通过监视进程的内存使用情况和 oom_score 值,您可以深入了解系统在内存压力下的反应。请记住,OOM Killer 是最后的手段。它旨在减轻灾难性故障,但终止进程仍然会产生负面后果。

主动措施

  1. 优化应用程序:确保您的软件编写良好且不会消耗过多内存。
  2. 监控内存使用情况:定期检查系统范围内的内存使用情况和各个进程的统计信息。
  3. 设置内存限制:考虑使用 cgroup 或其他机制来设置每个进程或进程组的内存使用限制。

Linux OOM Killer 在严重内存短缺期间维持系统稳定性方面发挥着至关重要的作用。其决策过程虽然复杂,但旨在通过选择最消耗的进程来最大程度地减少损害。通过了解 OOM Killer 的运行方式并采取主动措施来管理内存使用,您可以减少遇到 OOM 情况的可能性,并确保系统运行更顺畅、更可靠。

  三星 Galaxy S26 将采用 Hey Plex 作为新的 AI 唤醒短语