Linux OEMキラーの存続


Linuxマシンがメモリ不足になったとき、メモリ不足( OOM )キラーはカーネルによってメモリを解放するために呼び出されます.多くのメモリ集約型のプロセスを実行しているサーバでよく遭遇します.このポストでは、OOMキラーが呼ばれるとき、私たちは少し深く掘り下げます、どのように、どのプロセスが殺すかを決定するか、そして、我々がそれがデータベースのような重要なプロセスを殺すのを防ぐことができるならば.

どのようにオームのキラーを殺すためにどのプロセスを選択しますか?
Linuxカーネルは、実行中のプロセスごとにスコアを与えるoom_score これは、利用可能なメモリが少ない場合にどのように終了するかを示します.スコアは、プロセスによって使用されるメモリの量に比例します.得点は10 x percent of memory used by process . だから最大スコアは100 % x 10 = 1000です.また、プロセスが特権ユーザーとして動作している場合、通常のユーザープロセスで同じメモリ使用量と比較してわずかに低いスコアを取得します.以前のバージョンのLinux(v 2.6.32カーネル)では、このスコアを計算するより精巧なヒューリスティックがありました.
The oom_score プロセスの中に/proc ディレクトリ.プロセスのプロセスID ( PID )が42であるとしましょう.cat /proc/42/oom_score あなたのプロセスのスコアを与える.

私はいくつかの重要なプロセスをオームのキラーによって殺されないことを確認できますか?
はい!ORMキラーチェックoom_score_adj 最終的に計算されたスコアを調整します.このファイルは/proc/$pid/oom_score_adj . あなたは、あなたのプロセスがOmキラーによって選ばれて、終了されるより低いチャンスを得るのを確実にするために、このファイルに大きな否定的なスコアを加えることができます.The oom_score_adj 1000から1000まで変化することができます.あなたが1000をそれに割り当てるならば、それは100 %のメモリを使用することができて、まだOTMキラーによって終えられるのを避けます.一方、1000を割り当てると、Linuxカーネルは最小限のメモリを使用してもプロセスをkillし続けます.
PID 42でプロセスに戻りましょう.ここではどのように変更することができますoom_score_adj :
echo -200 | sudo tee - /proc/42/oom_score_adj
これを行う必要がありますroot ユーザーsudo なぜならLinuxは普通のユーザがOOMスコアを減らすことを許さないからです.任意の特別なアクセス許可なしで通常のユーザーとしてOOMスコアを増やすことができます.などecho 100 > /proc/42/oom_score_adjまた、別の、より細かい粒度のスコアoom_adj は16から15まで変化する.似ているoom_score_adj . 実際には、ときに設定oom_score_adj , カーネルは自動的に縮小し計算するoom_adj . oom_adj 指定されたプロセスがOOMキラーによって決して殺されてはならないことを示す- 17のmagic valueを持ちます.

すべての実行中のプロセスの表示OEMスコア
このスクリプトはOOMスコアの降順ですべての実行中のプロセスのOOMスコアとOGM調整スコアを表示します

#!/bin/bash
# Displays running processes in descending order of OOM score
printf 'PID\tOOM Score\tOOM Adj\tCommand\n'
while read -r pid comm; do [ -f /proc/$pid/oom_score ] && [ $(cat /proc/$pid/oom_score) != 0 ] && printf '%d\t%d\t\t%d\t%s\n' "$pid" "$(cat /proc/$pid/oom_score)" "$(cat /proc/$pid/oom_score_adj)" "$comm"; done < <(ps -e -o pid= -o comm=) | sort -k 2nr

あなたのプロセスのどれかがOOM
最も簡単な方法はgrep システムログ.Ubuntuでgrep -i kill /var/log/syslog . プロセスが死亡した場合、結果を得ることができるmy_process invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
オームのスコアを調整する警告
OOMがより大きな問題の症状であることを覚えておいてください.それを解決する最良の方法は、利用可能なメモリ(例えば、より良いハードウェア)を増やすか、プログラムを他のマシンに動かすか、プログラムのメモリ消費を減らすことによってである.
あまりにも多くの調整されたスコアの微調整は、ランダムなプロセスが殺され、十分なメモリを解放することができなくなります.

参考文献

  • proc マニュアルページ
  • https://askubuntu.com/questions/60672/how-do-i-use-oom-score-adj/

  • Walkthrough Linuxコードのどの部分を呼び出しますか
  • クラシックLWN article (少し)
  • Invoking the OOM killer manually