2013-10-22 53 views
5

私はApache + mod_wsgi + Djangoアプリを持っています。 mod_wsgiはデーモンモードで実行されます。Pythonがメモリを解放しない理由(mod_wsgi + Djangoの下で)

私はDBから重要なクエリーセットを取り出し、さらにクエリーセットの結果を計算して配列を割り当てた後、この配列を返します。スレッドローカルストレージ、グローバル変数などを使用していません。

問題は、私のアプリは、比較的私はmod_wsgiをするために設定した数のスレッドにメモリを食べることです。

私は、mod_wsgiでさまざまなスレッド数を設定し、wsgiプロセスがメモリ上昇できるかどうかを確認しながらカールを表示してビューを打つことで、小さな実験を行いました。

それはこのように書きます:

 
1 thread - 256Mb 
2 threads - 400Mb 
3 threads - 535Mb 
4 threads - 650Mb 

したがって、各スレッドが上位メモリ使用量に120-140Mbについて追加。

私は、最初の要求に割り当てられた最初のメモリが決して解放されないようです。シングルスレッドシナリオでは、(同じビューへの)2番目の要求が到着したときに再利用されます。これで私は去ることができます。

しかし、私は複数のスレッドを使用すると、要求が以前にこの要求を実行していないスレッドによって処理されると、このスレッドは別の場所に140Mbを "保存"します。

  • これはどのように修正できますか?
  • 恐らくDjangoはTSLにいくつかのデータを保存します。それが の場合、どうすれば無効にできますか?
  • また、回避策として、 は、特定のスレッドに要求実行をバインドすることが可能ですか?mod_wsgi

ありがとうございます。

PS。 DEBUGはFalseに設定されていますsettings.py

+0

a)データセットが到着したときだけ配列を作成し、b)ガベージコレクタがそれに到達できるようにデータセットを終了したら削除しますか? –

+0

a) - はい。 b) - 私はそれを明示的にdelしない。 JSONに変換してJSON文字列を返します。 –

+0

もしあなたがそれをdelしないなら、それはまだ使用中です! –

答えて

8

このような状況では、複数のmod_wsgiデーモンプロセスグループを横断するようにWebアプリケーションを垂直方向に分割する必要があります。こうすることで、mod_wsgiデーモンプロセスの設定を、それぞれに委譲するURLのサブセットの要件に合わせて調整することができます。 Djangoアプリケーションの管理画面のURLは、多くの場合、高い過渡メモリ使用量の要件を持って、まだ非常に頻繁に使用されていない、行うことが推奨されるように:

WSGIScriptAlias//my/path/site/wsgi.py 
WSGIApplicationGroup %{GLOBAL} 

WSGIDaemonProcess main processes=3 threads=5 
WSGIProcessGroup main 

WSGIDaemonProcess admin threads=2 inactivity-timeout=60 
<Location /admin> 
WSGIProcessGroup admin 
</Location> 

だから何これが行うには、2つのデーモンプロセス・グループを作成しています。デフォルトでは、URLはプロセスが永続的であるメインデーモンプロセスグループで処理されます。

ただし、adminデーモンのプロセスグループには、スレッド数を減らした単一のプロセスと非アクティブなタイムアウトを設定してプロセスを再開できるようにすることができます管理インターフェースが60秒後に使用されないと、自動的に過度の過渡メモリー使用量を再利用します。

これは、前回からプロセスがリサイクルされている場合は、すべてを再度ロードする必要があるため、管理インターフェイスでありパブリックURLではないため、管理インターフェイスへのリクエストの送信がわずかに遅くなる可能性があります。これは一般に許容されます。

+0

このアプローチに感謝します。問題をローカライズする必要があります。私はまだしかし、Djangoがフェッチされたオブジェクトを解放しない理由に興味があります。しかし、私は別の質問で尋ねます –

関連する問題