私はいくつかのDjangoアプリを本番環境で実行しているDebian Wheezy VPSボックスを持っています。理想的には、アプリを最適化してさらに現在のメモリフットプリントの問題に対処し、さらにRAMまたはSwapで拡張しますが、問題は、Djangoアプリ(スタックはオープンソースで堅牢)、また、RAMは私にとってコストの制約です(これはリモートVPSです)。また、ホストはスワップを使用するオプションを提供していません!
したがって、その間(より多くのリソースを確保してより多くのRAMを提供するのを待つ間)、サーバーがメモリを使い果たしてVPSの再起動を要求しなければならないシナリオを緩和したいと思います(その時点で、ボックスにSSHで接続することさえできません!)。
したがって、ソリューションで私が気に入っているのは、プロセス(または一般的にはシステムの合計メモリ使用量)が特定のクリティカル量を超えたときに検出する機能です(今のところ、たとえば、FREE RAMたとえば10%)-これは、VPSが長時間稼働した後、および一部の重いアプリ(とにかくほとんどがステージングアプリ)へのトラフィックが突然多くなるときに発生することに気づきました。
したがって、問題のあるプロセス(おそらくApache)を強制終了/再起動できるようにしたいと思います。これらの状況で手動で実行した場合、どのソリューションが正常なメモリ使用量レベルを復元しましたか?おそらく1つ以上のDjangoアプリにメモリリークがあることを示唆していますか?
簡単に言うと:
Linuxカーネルには、いわゆるOOMKillerが組み込まれています。それは「メモリ不足キラー」です。したがって、ボックスがRAMとスワップを使い果たすと、カーネルはサーバーにアクセスできるようにするためにものを殺し始めます。
プロセスの優先順位を微調整して、プロセスが強制終了される「可能性」を判断できます。詳細については、 このリンク を参照してください。「OOMKillerの構成」のセクションを参照してください。
基本的に、/ proc/*/oom_adjファイルで尤度を調整します。例えば。現在実行中のApacheインスタンスを強制終了する可能性を高めますか?
pgrep Apache2 | Sudo xargs -I%PID sh -c'echo 10>/proc /%PID/oom_adj '
または、SSHが強制終了される可能性を低くします。
pgrep sshd | Sudo xargs -I%PID sh -c'echo -17>/proc /%PID/oom_adj '
また、この問題が発生しているサーバーでは、スワップを完全に無効にすることをお勧めします。スワップが非常に遅いため、スワップスペースが残っていても、サーバーを仮想停止状態にすることができ、OOMキラーがトリガーされることはありません。
これらのアプリがApache2
サーバー内で実行されている場合は、サーバーを調整できます。考えてみましょう:
プロセスでメモリリークが発生している場合は、/etc/security/limits.conf
を使用して、サーバーに含めることができるメモリの量を制限できます。これにより、サーバーが大きくなりすぎるのを防ぎます。同じ効果は、ulimit
コマンドを使用して一時的に達成できます。 ulimit
を使用して適切なサイズを見つけてから、それらの値をlimits.conf
ファイルに設定することをお勧めします。サーバーがサポートしている場合は、/etc/security/limits.d
を編集するのではなく、ファイルを/etc/security/limits.conf
にドロップします。
まず第一に、再起動は解決策の問題ではなく、問題のあるプロセスを見つけ、それが大量のメモリを消費している理由を見つけることです。上記のように、Linuxには、問題のあるプロセスを見つけてそれを強制終了してメモリのプレッシャーを解放するOOMメカニズムがすでにあります。
Kdumpを使用してそれを見つける他の方法は、このパラメーターvm.panic_on_oom = 1(/etc/sysctl.conf)を構成します。これにより、システムがメモリ不足になったときにvmcoreが生成されます。詳細については、こちらをご覧ください。
http://people.redhat.com/anderson/crash_whitepaper/
また、limits.confには多くの制限があり、cgroupを使用してプロセスごとのメモリ使用量を制限することをお勧めします
/etc/cgconfig.confで、次のようにコントロールグループを定義できます(ここでは、256MBのメモリのみを使用するようにアプリを制限しています)
group test {
memory {
memory.limit_in_bytes = 256m;
}
}
/etc/cgrules.confで、アプリの使用率を定義できます(あなたの場合Djangoが256を超えることはできません)
*:Django memory test/
Cgroupの詳細については、参照できます
しかし、アプリを再起動するという考えは悪いようです。