OOM Killerについて

投稿者: | 12月 20, 2023

よく、誰のせい?とか言われることがあるが、誰のせいがわかってどうしたいの?と思うことがある。日本の古き文化の切腹ってまさしく、それ。責任がありました。死んでお詫びします。でも、当人が死んだところで何も解決しない。まぁ、当人としても、死んで済むならそれでいいやなのかもしれないが。。。これ、江戸時代の話。

現代でも、切腹とまではいかないが、他責文化があって、人のせいにしがち。例えば、担当の責任なので、担当を変えてくれ、とか担当を変えたとか、単に人を変えただけで何も好転するわけでもなく。。。ちゃんと何が悪かったのか、これからどうするべきなのかをしっかり議論して、担当を変えるべきなんだが。まぁ、これが日本人だと担当を変えてくれ、変えることに命をかけてしまう。人は死なないけど、マインドセットは切腹だと思う。

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

 

出力はこんな感じ。

UntitledImage

とここまで書いて気がついた。dstatで出せる。RHELはRHEL8以降は別のパッケージなんだが、プラグインがなかった。

apt -y install dstat
dstat --top-oom

UntitledImage

ちなみに、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"

UntitledImage

これで、誰のせいかをみてみてくれw

コメントを残す