E.3.12. /proc/PID/
OOM (Out of Memory) は、スワップ領域を含む利用可能なメモリーがすべて割り当てられているコンピューティング状態を指します。この状況が発生すると、システムがパニックになり、期待通りに機能しなくなります。
/proc/sys/vm/panic_on_oom
で OOM の動作を制御するスイッチがあります。1
に設定すると、カーネルは OOM でパニックが生じます。0
の設定は、カーネルに対し、OOM で oom_killer
という名前の関数を呼び出すように指示します。通常、oom_killer
は不正なプロセスを強制終了し、システムは存続します。
これを変更する最も簡単な方法は、新しい値を
/proc/sys/vm/panic_on_oom
にエコーすることです。
# cat /proc/sys/vm/panic_on_oom 1 # echo 0 > /proc/sys/vm/panic_on_oom # cat /proc/sys/vm/panic_on_oom 0
oom_killer
スコアを調整して、プロセスの強制終了を優先することもできます。/proc/PID/
には、oom_adj
と oom_score
という 2 つのツールのラベルがあります。oom_adj
の有効なスコアは、-16 から +15 の範囲にあります。現在の oom_killer
スコアを表示するには、プロセスの oom_score
を表示します。oom_killer
は、スコアが最も高いプロセスを強制終了します。
この例では、PID が 12465 のプロセスの oom_score を調整し、
oom_killer
が強制終了する可能性が低くなります。
# cat /proc/12465/oom_score 79872 # echo -5 > /proc/12465/oom_adj # cat /proc/12465/oom_score 78
また、-17 に特殊な値もあり、これにより、そのプロセスの
oom_killer
が無効になります。以下の例では、oom_score
は 0 の値を返し、このプロセスは強制終了されないことを示します。
# cat /proc/12465/oom_score 78 # echo -17 > /proc/12465/oom_adj # cat /proc/12465/oom_score 0
badness()
と呼ばれる関数を使用して、各プロセスの実際のスコアを決定します。これは、検査された各プロセスに「ポイント」を追加して行います。プロセススコアは以下の方法で行われます。
- 各プロセスのスコアのベースは、メモリーサイズです。
- プロセスの子(カーネルスレッドを含む)のメモリーサイズもスコアに追加されます。
- プロセスのスコアが「niced」プロセスのスコアが引き上げられ、長時間実行中のプロセスの場合は減少します。
CAP_SYS_ADMIN
およびCAP_SYS_RAWIO
機能を持つプロセスにより、スコアが減少します。- 最終的なスコアは、
oom_adj
ファイルに保存されている値によってビットシフトされます。
そのため、
oom_score
値が最も高いプロセスは、ほとんどの場合権限がなく、その子とともに大量のメモリーを使用し、生の I/O を処理しない可能性があります。