Skip to content

Instantly share code, notes, and snippets.

@denvernine
Last active November 25, 2022 03:09
Show Gist options
  • Save denvernine/d0d01a2f12dc6ab81861a037a4a1e3af to your computer and use it in GitHub Desktop.
Save denvernine/d0d01a2f12dc6ab81861a037a4a1e3af to your computer and use it in GitHub Desktop.
重要なプロセスをOOM killerの対象にならないように制御する

OOM killerがやってきてsshできなくなったときにやったこと

VirtualBox上の開発環境にいつもどおりsshしようとしたある日、まったく反応が返ってこなくなりました。pingは通るので、コンソールからログを見てみたところOOM killerが動いているようでした。

sshできないとどうにもならないので、とりあえず再起動。今後のためにもOOM killerの活動をある程度制御することにしました。

/proc/*/oom_score_adj

簡単に言えば、OOM killerはメモリを食い散らかすプロセスをkillしてシステム全体を守るものです(詳細は先人の素晴らしい記事を参照してください)。とはいえなんでもかんでもkillされては困るので、優先度を制御します。今回の環境ではsshdもkill対象に入っていたので、今後対象から外れるようにします。

やることは簡単で、

  • ps aux | grep ssh | grep -v grep などで対象のPIDを検索
  • echo -1000 > /proc/${pid}/oom_score_adj などでoom_score_adjに-1000と書き込む

だけです。

先述のように、今回の環境はsshdのoom_score_adjは0になっており、kill対象になっていました。-1000にすることで /proc/${pid}/oom_score を補正し、OOM killerのkill対象から外すことができます。

references

#!/bin/bash
#
# @(#) display processes with oom_score_adj less than 0.
#
for process in /proc/[1-9][0-9]*; do
if [[ $(cat ${process}/oom_score_adj) -lt 0 ]]; then
echo ${process} $(cat ${process}/comm): $(cat ${process}/oom_score_adj)
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment