web-dev-qa-db-ja.com

LinuxOOMがWebサーバー上のApacheを強制終了しないようにする

Debian linuxWebサーバーがあります。 Apache2を実行しているだけです。私たちのmysqlサーバーは別のホスト上にあります。ただし、通常のタスクを実行するために、Webサーバーでcronタスクを実行することがあります。

ただし、最近、cronタスクの1つにバグがあり、メモリを使い果たし始めました。 LinuxOOMキラーがApacheを殺しました。もちろん、これは私たちのWebサイトをダウンさせました。メモリを大量に消費するcronが実行を続けました。ただし、この場合、OOMキラーにそのスクリプトを強制終了してもらいたいのですが、not Apacheです。

'Apache2'と呼ばれるプロセスを殺さないと言うことができるようにカーネルを構成する方法はありますか(または少なくともApache2をlastそれが殺すもの)? Apacheと通常のcronの両方が同じユーザー(www-user)として実行されます。

6
Rory

このcronジョブが大量のメモリを消費している理由を実際にデバッグすることで、問題の根本原因に対処しているようには思えません。

このオプションを設定してみてください

エコー1>/proc/sys/vm/oom_kill_allocating_task

これは、OOMキラーにOOM状態をトリガーしたプロセスを強制終了するように指示しますが、これがcronジョブであるとは限りません。スクリプトで「ulimit-m」を使用して、使用する常駐メモリの最大量を設定することもできます。あなたの最善の策は、cronジョブがなぜこれほど多くのメモリを消費しているのか、そしておそらくそれが別のホストに最も適しているのか、それともより少ないメモリを消費するように書き直されるのかを評価することだと思います。

3
jlintz

OOMKiller isある程度設定可能です。プロセスを起動した後、/proc/<pid>/oom_adjの値を負の整数に設定できます。これは、プロセスとその子に対するOOMKillerの親和性に影響します。システムがメモリ不足状態になると、他のプロセスが強制終了されます。

3
Kamil Kisiel

コミット動作を介して仮想メモリを変更することもできます。たとえば、/ proc/sys/vm/overcommit_memoryの値を「2」に変更できます。これはメモリをオーバーコミットしないことを意味します。 (この値が何をするのかを理解せずに、この値を変更しないでください。)

「オーバーコミットなし」モードでは、新しいプロセスがRAMの追加を要求すると、割り当てを試みるときにエラーが発生します。したがって、OOMキラーに行って、古い、長時間実行されているプロセスを破壊するのではなく、RAMは「いいえ」と言われます。

...そして、メモリの問題を修正する必要があります。リークを見つけ、メモリを消費するプロセスを再設計し、ボックスにRAMを追加します。

1

簡単な答え:いいえ、OOM-killerは構成できません。また、それを変更することには 抵抗 があります。

私の頭のてっぺんからほんの少しのアイデア:

  1. スワップスペースを増やす-スクリプトが32ビットの場合、使い尽くすのに十分なスペースをスクリプトに与えるのは簡単です。

  2. 物理メモリを増やします。ほぼ1で。

  3. ulimitを使用して、スクリプトが使用できるメモリの量を制限します。

0
Douglas Leeder

ここでは、プロセスにOOM_DISABLE「フラグ」を設定できると書かれています。 http://linux-mm.org/OOM_Killer

0
Rolf