/proc/[pid]/oom_adjとは?
oom_adjはプロセスごとに設定できる値で、これによってOOM KillerにKillされる優先度を変更できます。
Linux OOM Killerについて
子プロセスに継承される
新しいプロセスは親のoom_adjを受け継ぎます。
設定できる値の範囲
- 1~15: 大きいほどkillされやすい
- 0: 初期値
- -16~-1: 小さいほどkillされづらい
- -17: killされない
俺さん(20代♂, 会社員)の場合
- dockerでサーバーを起動しているが、アクセス次第でメモリ消費量が増えてOOM killerが発動することがある。
- サーバーが落ちたら再起動するスクリプト経由でサーバーを起動しているので、サーバー本体がkillされれば問題無いのだが、なぜかいつも再起動するスクリプト本体がkillされてしまう。
- サーバー本体のoom_adjを上げてサーバー本体が先にkillされるようにした。
例1_簡単な使い方
./change_oom_adj.sh 5 ls
例2_サーバー起動スクリプト
while :
do
./change_oom_adj.sh 5 bundle exec unicorn_rails -c /myapp/config/unicorn.rb -E ${RAILS_ENV} -p 3000
sleep 1
done
oom_adj変更スクリプト
change_oom_adj.sh
#!/bin/bash
set -e
usage_exit() {
echo "Usage: $0 [oom_adj] command" 1>&2
exit 1
}
oom_adj=$1
shift;
number_regex='^-?[0-9]+$'
if ! [[ $oom_adj =~ $number_regex ]] ; then
usage_exit
fi
pid=$$
echo $oom_adj > /proc/$pid/oom_adj
"$@"