kernel:Memory Manage(4) OOM Killer

  • 空きメモリを確保する仕組みとして"OOM Killer(Out of Memory Killer)"というものがある
  • OOM Killerは、空きメモリが足りない場合に強制的にProcessを終了させて強引に空きメモリを確保する
  • OOM Killerは、空きメモリが確保できないためにシステム全体が停止してしまうことを防止するために用意されている
  • OOM Killerはシステム停止を防止するために必要な機能だが、OOM Killerによる強制終了は大切なProcessを停止させてしまう危険性がある
    • クラスタシステムなどにおいて、クラスタ監視Processが強制停止させられてしまった場合、それが原因となってクラスタの障害が発生してしまう危険性がある
    • kernel2.6.17.1向けにOOM Killerを使用せずにkernel panicを起こさせるパッチが投稿された。これを使用すると、空きメモリが確保できない場合にはkernel panicによりシステムが停止することにより、クラスタの切り替わりは正常に実施されることになる

OOM Killerに対するチューニング方法

  • (1)優先度を下げて強制終了を回避する
    • kernel2.6.11以降では、OOM Killerの対象となるProcessの優先度を設定できるようになった
    • "/proc//oom_adj"ファイルに優先度を指定する
    • 指定可能な範囲は-16〜15まで、値が低いほどOOM Killerの対象となる優先度が低下する

実際にやってみた(topをバックエンドプロセスとして実行し、Process IDを指定して"oom_adj"値を0から10に変えてみる)

[root@tkcent1 ~]# top &
[1] 4185
[root@tkcent1 ~]# cat /proc/4185/oom_adj 
0
[root@tkcent1 ~]# echo 10 > /proc/4185/oom_adj
[root@tkcent1 ~]# cat /proc/4185/oom_adj 
10
    • このように設定することにより、Process 4185で実行されているtop Processは、他のProcessと比較して強制終了させられる可能性が高くなる
    • kernel2.6.12-rc3以前は、OOM Killerにより強制終了させられない例外ProcessはProcess ID1の"init"のみだったが、"oom_adj"値として-17を指定することにより、OOM Killerの対象外とするProcessを任意に指定することが可能となった

実際にやってみた(topプロセスの"oom_adj"値を-17に設定してみる)

[root@tkcent1 ~]# echo -17 > /proc/4185/oom_adj 
[root@tkcent1 ~]# cat /proc/4185/oom_adj 
 -17
    • "oom_adj"値として-17を指定することによって、OOM KillerによるProcessの強制終了の対象から除外することが可能となるが、多くのProcessを-17に設定した場合、空きメモリを確保する手段がないためにシステム自体がダウンする(kernel panic)可能性もあるので必要以上に設定することは推奨されない
  • (2)OOM Killerの実行自体を抑制する

OOM Killerに対して設定することが可能なパラメータ

パラメータ 内容
0 メモリ要求がされたが必要な空き容量が確保できない場合、実行中のProcessを強制終了させることにより空きメモリを確保する。
1 実際にメモリを使い切ってしまう状態になるまでメモリがあるとして動作する。ただし、メモリを実際に使用する段階でメモリを確保できない場合には、実行中のProcessを強制終了させて空きメモリを確保する。
2 実際のメモリ量を超えるメモリ要求があった段階でProcessに対してエラーが返される。Processの実行中にメモリ不足が原因でOOM Killerによる強制終了が実行されることはない。
    • OOM Killerのパラメータ値を調整するには、"/proc/sys/vm/overcommit_memory"値を設定する

実際にやってみた("/proc/sys/vm/overcommit_memory"値をデフォルトの0から2に変更してみる)

[root@tkcent1 ~]# cat /proc/sys/vm/overcommit_memory 
0
[root@tkcent1 ~]# echo 2 > /proc/sys/vm/overcommit_memory 
[root@tkcent1 ~]# cat /proc/sys/vm/overcommit_memory 
2