每个流程的 OOM 分数

每个流程的 OOM 分数

对此,我做出回应。

查看有关配置 OOM 杀手的问题。例如:https://unix.stackexchange.com/q/153585/21101

我正在寻找在内存不足的情况下哪个进程会首先被终止。

有没有办法可以查看每个进程的 OOM 分数,而不是单独查看每个进程的 OOM 分数?

答案1

最简单的方法是

cat /proc/*/oom_score

如果你想要更多信息(例如 PID 和命令字符串),那么也许一个简单的循环

while read -r pid comm; do 
  printf '%d\t%d\t%s\n' "$pid" "$(cat /proc/$pid/oom_score)" "$comm"
done < <(ps -e -o pid= -o comm=)

答案2

下面是一个很长的单行代码,它将每个进程的 OOM 分数添加到“ps”的输出中:

export oom_prop="oom_score"
ps axfuww | perl -pe 's/^(USER\s+PID)/sprintf("%s %s", $1, uc($ENV{"oom_prop"}))/e' | perl -MFile::Slurp -pe 's~^(\S+\s+)(\d+)(\s+)~sprintf("%s%s%s%*s  ", $1, $2, $3, length($ENV{"oom_prop"}) - 1, read_file("/proc/$2/$ENV{\"oom_prop\"}", {err_mode => "quiet", chomp => 1}))~e' | less -S

“ps”输出如下所示:

USER         PID OOM_SCORE %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1         0  0.0  0.2 169612 13128 ?        Ss   Sep27   0:08 /sbin/init
root         275       508  0.0  2.2 186404 114428 ?       S<s  Sep27   0:06 /lib/systemd/systemd-journald
root         339         0  0.0  0.1  24260  6880 ?        Ss   Sep27   0:09 /lib/systemd/systemd-udevd
root         568       666  0.0  0.1 241940  8612 ?        Ssl  Sep27   0:16 /usr/lib/accountsservice/accounts-daemon
root         572       666  0.0  0.0   2540   768 ?        Ss   Sep27   0:05 /usr/sbin/acpid
...

您可以通过在初始命令中指定“oom_score”或“oom_score_adj”来控制要监控哪个 OOM 属性export oom_prop

您还需要File::SlurpPerl 模块。这是一个很流行的模块,您可以使用操作系统的打包系统或通过 CPAN 安装它。

相关内容