Skip to content

OOM Score

修改 oom_score 可以在某些情况下有用,特别是在管理进程的内存回收优先级时。oom_score 是 Linux 内核用于选择哪个进程应该在内存不足时(触发 OOM Killer 时)被终止的一个指标。

oom_score 的作用

  • oom_score:表示进程被杀死的优先级。数值越高,表示该进程在 OOM(Out of Memory,内存不足)时被杀死的可能性越大。每个进程都有一个 oom_score 值,表示该进程在 OOM 情况下的杀死优先级。
    • 值范围:0 到 1000,越高的值表示进程越容易被 OOM Killer 终止。
    • 默认情况下,进程的 oom_score 是根据其内存使用情况、运行时间、以及其他因素动态计算的。
  • oom_score_adj:是可以用来调整 oom_score 的值。通过调整 oom_score_adj,你可以改变某个进程在内存不足时被杀死的概率。它的值范围是 -1000(表示非常不容易被杀死)到 1000(表示非常容易被杀死)。
    • 默认情况下,oom_score_adj 为 0,意味着进程的杀死优先级是默认计算的。
    • 修改 oom_score_adj 可以影响进程在 OOM 情况下的优先级,而不需要改变内核的行为或完全依赖内核自动判断。

如何修改 oom_score_adj

查看进程的 oom_scoreoom_score_adj

bash
cat /proc/<pid>/oom_score
cat /proc/<pid>/oom_score_adj

修改 oom_score_adj,你可以向 /proc/<pid>/oom_score_adj 文件写入一个新的值。需要使用 root 权限:

bash
echo <value> | sudo tee /proc/<pid>/oom_score_adj

例如,将进程的 oom_score_adj 设置为 -1000(让该进程在内存不足时不容易被杀死):

bash
echo -1000 | sudo tee /proc/<pid>/oom_score_adj

或者将其设置为 1000(让该进程在内存不足时容易被杀死):

bash
echo 1000 | sudo tee /proc/<pid>/oom_score_adj

修改 oom_score_adj 的用途

  • 保护关键进程:如果你有一些关键的服务或进程(如数据库、重要的守护进程),你可以将它们的 oom_score_adj 设置为一个负值(例如 -1000),这样它们在内存不足时就不容易被 OOM Killer 终止。
  • 降低不重要进程的优先级:对于一些可以容忍被杀死的非关键进程,你可以将它们的 oom_score_adj 设置为较高的值(例如 1000),这样当内存不足时,这些进程会更容易被终止。

是否有用?

  • 有用:如果你有对系统内存使用非常敏感的进程,调整 oom_score_adj 是非常有用的。它能帮助你管理哪些进程应该在 OOM 情况下优先被终止,哪些应该被保留。
  • 不过,不能完全避免 OOM Killer:即使你将进程的 oom_score_adj 设置为负值或很低的值,系统在极端内存不足的情况下仍然可能会选择终止其他进程。oom_score_adj 只是影响 OOM Killer 选择终止进程的优先级,而不是完全避免进程被杀死。

总结

修改 oom_score_adj 是一种有效的管理 OOM Killer 行为的方式,可以帮助你保护关键进程或减少不重要进程被杀死的概率。但它并不是一种根本解决方案,仍然依赖于系统内存管理的状态。