对此,我做出回应。
查看有关配置 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::Slurp
Perl 模块。这是一个很流行的模块,您可以使用操作系统的打包系统或通过 CPAN 安装它。