19

リクエストごとにdjangoアプリのメモリ使用量を効率的に記録する方法を知っていますか?

通常は正常に動作する apache/mod_wsgi/django スタックがありますが、1 つのプロセスが大量のメモリを消費することがあります。サーバーのメモリが不足し、大量のスワップが発生し、サービスが劇的に遅くなります。

この状況を修正するのは非常に困難です。なぜなら、この動作の原因がどの要求にあるのかわからず、再現できないからです。

最小限のオーバーヘッドで、各リクエストの前後にプロセスのメモリ使用量を記録するものを本番環境にデプロイしたいと思います。


車輪の再発明を始める前に、仲間のジャンゴイストのコミュニティは、この問題に対処するための既存の解決策を知っていますか? アドバイス、ミドルウェア、スニペット、またはおそらく apache ログ構成を高く評価します。

私が必要としない(と思う)ものは次のとおりです。

  • 開発段階のプロファイリング/デバッグ ツールのセットです。私はすでにいくつかを知っており、何をプロファイリング/デバッグするかを知っていればそれらを使用します。本番環境で実行されているサービスを永遠に監視するには少し多すぎるように見えます。その上、通常、これらの tol によって表示されるのは、断片化されたコードのメモリ使用レポートです。これは、問題のあるリクエストを特定するだけで非常に役立ちます。
  • django アプリのメモリ使用を最適化する方法に関する一般的なアドバイスです。読むのはいつでも良いことですが、ここでの考え方はむしろ「最適化が必要なリクエストを効率的に追跡する方法」です。

最も近い検索結果:

4

2 に答える 2

21

メモリ使用量を追跡し、すぐに使用可能な結果を​​生成する Django ミドルウェアは、プロセス リクエストとプロセス レスポンスの両方をフックする必要があります。つまり、リクエストの開始と終了の差を見て、あるしきい値を超えた場合は警告をログに記録します。

完全なミドルウェアの例は次のとおりです。

import os
import psutil
import sys

THRESHOLD = 2*1024*1024

class MemoryUsageMiddleware(object):

    def process_request(self, request):
        request._mem = psutil.Process(os.getpid()).memory_info()

   def process_response(self, request, response):
        mem = psutil.Process(os.getpid()).memory_info()
        diff = mem.rss - request._mem.rss
        if diff > THRESHOLD:
            print >> sys.stderr, 'MEMORY USAGE %r' % ((diff, request.path),)
        return response

これには、メモリ計算を行うために「psutil」モジュールをインストールする必要があります。

ブルート フォースであり、マルチスレッド システムでの誤検出につながる可能性があります。遅延読み込みのため、新しいプロセスに対する最初のいくつかのリクエストが読み込まれると、それがトリガーされることもわかります。

于 2012-09-03T21:48:57.273 に答える
1

これでは質問を完全にカバーできない場合がありますが、apache2+mod_wsgiの代わりにnginx+uwsgiを試すことをお勧めします。私のテストでは、はるかに安定していて(mod_wsgiがある時点で完全にチョークされている)、はるかに高速で、使用するメモリがはるかに少ないことがわかりました(すべての問題を完全に修正できる可能性があります)。

メモリ使用量の追跡については、簡単なミドルウェアを作成できます。

class SaveMemoryUsageMiddleware(object):
    def process_response(self, request, response):
        # track memory usage here and append to file or db
        return response

ミドルウェアに追加します。

メモリ追跡コードについては、チェックアウトすることをお勧めします: Pythonプロセスで使用される合計メモリ?

ただし、本番環境でこれを行わないようにできれば、おそらくより良いでしょう。実際の問題を追跡するための開発とテストのためだけに。

于 2012-09-03T14:04:03.420 に答える