Linux の OOM が Web サーバー上の Apache を強制終了するのを防ぐ

Linux の OOM が Web サーバー上の Apache を強制終了するのを防ぐ

私たちは Debian Linux ウェブサーバーを持っています。これは apache2 を実行しているだけです。MySQL サーバーは別のホストにあります。ただし、定期的なタスクを実行するために、ウェブサーバーで cron タスクを実行することがあります。

しかし最近、cronタスクの1つにバグがあり、メモリを食い尽くし始めました。Linux OOMキラーはApacheを強制終了しました。もちろん、これによりWebサイトがダウンしました。メモリを大量に消費するcronは実行し続けました。しかし、この場合、OOMキラーでそのスクリプトを強制終了し、ないアパッチ。

カーネルを設定する方法はありますか?しない'apache2'というプロセスを強制終了する(または少なくともapache2を最後何が強制終了されるのでしょうか? Apache と通常の cron は両方とも同じユーザー (www-user) として実行されます。

答え1

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

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

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

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

答え2

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

答え3

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

「オーバーコミットなし」モードでは、新しいプロセスがさらに RAM を要求すると、割り当てを試みるとエラーが発生します。そのため、OOM キラーが古い長時間実行プロセスを停止するのではなく、RAM を要求する新しいプロセスに「いいえ」が通知されます。

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

答え4

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

関連情報