Red Hat Training

A Red Hat training course is available for Red Hat Linux

E.3.12. /proc/PID/

Out of Memory (OOM) とは、swap 領域を含むすべてのメモリ空き容量が割り当て済みの状態であることを指します。このような状態が発生した場合には、システムがパニックを起し、正常機能を停止してしまいます。OOM の動作を制御するスイッチは、/proc/sys/vm/panic_on_oom にあります。1 に設定すると、カーネルは、OOM でパニックを起こします。0 は、カーネルが oom_killer という名前の関数を OOM に対して呼び出すように指示します。通常、 oom_killer はローグプロセスを強制終了し、システムは稼働状態を維持することができます。
この設定を変更する最も簡単な方法は、/proc/sys/vm/panic_on_oom に新たな値を echo する方法です。
# 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 of a process を調整し、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' (nice 度の高い) プロセスにはプロセスのスコアが加算され、長時間実行されているプロセスには削減されます。
  4. CAP_SYS_ADMIN 及び CAP_SYS_RAWIO の機能に伴うプロセスは、スコアが削減されます。
  5. 最終スコアは、oom_adj ファイルに保管されている値によってビットシフトされます。
従って、oom_score 値が最も高いプロセスは、優先されず、最近開始したプロセスの可能性が高く、これはその子プロセスとともに、大容量のメモリを使用し、「nice 度が高く」、raw I/O を一切処理しないものです。