よく、誰のせい?とか言われることがあるが、誰のせいがわかってどうしたいの?と思うことがある。日本の古き文化の切腹ってまさしく、それ。責任がありました。死んでお詫びします。でも、当人が死んだところで何も解決しない。まぁ、当人としても、死んで済むならそれでいいやなのかもしれないが。。。これ、江戸時代の話。
現代でも、切腹とまではいかないが、他責文化があって、人のせいにしがち。例えば、担当の責任なので、担当を変えてくれ、とか担当を変えたとか、単に人を変えただけで何も好転するわけでもなく。。。ちゃんと何が悪かったのか、これからどうするべきなのかをしっかり議論して、担当を変えるべきなんだが。まぁ、これが日本人だと担当を変えてくれ、変えることに命をかけてしまう。人は死なないけど、マインドセットは切腹だと思う。
OOM Killerの話があって、あるアプリをいれたらOOM Killerで止まったら、止まるかもという話があった。ほんとにそんな止まるようなサーバがあるのか?まずはちゃんと調べてみようと。。。
閑話休題
OOM Killerについてスクリプトを作ってみた。OOM Killerのイロハは、ググるといろいろ出てくるので割愛。
スコアが0ではないもので、oom_scoreの大きい順に出力してくれるリスト。別名容疑者候補ランキング。
もちろん、ここに出てくるのが犯人というわけではない。なので、しっかりOOM Killerを理解しておくことをお勧めする。
#!/bin/bash
proc_dirs=(/proc/[0-9]*)
for dir in "${proc_dirs[@]}"; do
pid=$(basename "$dir")
oom_adj=$(cat "$dir/oom_adj")
oom_score_adj=$(cat "$dir/oom_score_adj")
oom_score=$(cat "$dir/oom_score")
rss_total=$(ps -p $pid -o rss= | awk '{sum+=$1} END {print sum}')
rss_total_mb=$(echo "scale=2; $rss_total / 1024" | bc)
if [ "$oom_score" -ne 0 ]; then
process_name=$(cat "$dir/comm")
echo -e "Process: \e[1m$pid/$process_name \trss_total(MB): $rss_total_mb\e[0m \tadjust: $oom_adj\tscore_adj: $oom_score_adj\t\e[1mScore: $oom_score\e[0m"
fi
done | sort -k 10 -n -r
出力はこんな感じ。
とここまで書いて気がついた。dstatで出せる。RHELはRHEL8以降は別のパッケージなんだが、プラグインがなかった。
apt -y install dstat
dstat --top-oom
ちなみに、OOM Killerの対象外で、メモリの消費が0以外のものをリストするスクリプト
#!/bin/bash
proc_dirs=(/proc/[0-9]*)
for dir in "${proc_dirs[@]}"; do
pid=$(basename "$dir")
oom_score=$(cat "$dir/oom_score")
rss_total=$(ps -p $pid -o rss= | awk '{sum+=$1} END {print sum}')
rss_total_mb=$(echo "scale=2; $rss_total / 1024" | bc)
if [ "$oom_score" -eq 0 ]; then
process_name=$(cat "$dir/comm")
echo -e "Process: \e[1m$pid/$process_name\e[0m \trss_total(MB): $rss_total_mb"
fi
done | grep -v "rss_total(MB): 0"
これで、誰のせいかをみてみてくれw