Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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_adjoom_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() と呼ばれる関数を使用して、各プロセスの実際のスコアを決定します。これは、検査された各プロセスに「ポイント」を追加して行います。プロセススコアは以下の方法で行われます。
  1. 各プロセスのスコアのベースは、メモリーサイズです。
  2. プロセスの子(カーネルスレッドを含む)のメモリーサイズもスコアに追加されます。
  3. プロセスのスコアが「niced」プロセスのスコアが引き上げられ、長時間実行中のプロセスの場合は減少します。
  4. CAP_SYS_ADMIN および CAP_SYS_RAWIO 機能を持つプロセスにより、スコアが減少します。
  5. 最終的なスコアは、oom_adj ファイルに保存されている値によってビットシフトされます。
そのため、oom_score 値が最も高いプロセスは、ほとんどの場合権限がなく、その子とともに大量のメモリーを使用し、生の I/O を処理しない可能性があります。