web-dev-qa-db-ja.com

Djangoメモリ使用量を減らします。

私のメモリ使用量は時間とともに増加し、再起動Djangoはユーザーに親切ではありません。

メモリ使用量のプロファイリングの方法はわかりませんが、測定を開始するためのヒントが役立ちます。

大きな利益を生むことができるいくつかの簡単なステップがあると感じています。 「debug」が「False」に設定されていることを確認することは明らかです。

誰か他の人を提案できますか?トラフィックの少ないサイトでのキャッシュはどれくらい改善されますか?

この場合、mod_pythonを使用してApache 2.xで実行しています。 mod_wsgiは少しスリムであると聞いたことがありますが、この段階で切り替えるのは難しいでしょう。

編集:これまでのヒントをありがとう。メモリを使い果たしているものを発見する方法はありますか? Pythonメモリプロファイリングのガイドはありますか?

また、前述したように、mod_wsgiに切り替えるのが難しいいくつかのことがあります。そのため、その方向に進む前に期待できるゲインについて考えてみたいと思います。

編集: カールは、読む価値があるもう少し詳細な回答をここに投稿しました: Django Deployment:Cutting Apacheのオーバーヘッド

編集: Graham Dumpletonの記事 は、MPMおよびmod_wsgi関連のもので見つけた最高のものです。ただし、アプリ自体のメモリ使用量のデバッグに関する情報を誰も提供できないことに失望しています。

最終編集: 私はこれをWebfactionで議論していて、Apacheの再コンパイルを支援できるかどうかを確認しています。

「MPM Workerとmod_wsgiのセットアップに切り替えることで、多くのメリットが得られるとは本当に思っていません。20MB程度節約できるかもしれませんが、おそらくそれ以上ではないでしょう。」

そう!これは私の元の質問(私はまだ賢明な人ではありません)に戻ります。問題がどこにあるのかを特定するにはどうすればよいですか?最適化する必要がある場所を確認するためにテストせずに最適化しないことはよく知られている格言ですが、Pythonメモリ使用量を測定することに関するチュートリアルの方法はほとんどなく、ジャンゴ。

皆さんの支援に感謝しますが、この質問はまだ開かれていると思います!

別の最終編集;-)

Django-usersリストでこれを聞いて、いくつかの very有用な回答

正直なところこれまでの更新!

これはちょうどリリースされました。まだ最良の解決策になる可能性があります: プロファイリングDjango Pymplerでのオブジェクトサイズとメモリ使用量

136
Andy Baker

データへのグローバル参照を保持していないことを確認してください。これにより、pythonガベージコレクターがメモリを解放できなくなります。

mod_pythonを使用しないでください。 Apache内にインタープリターをロードします。 Apacheを使用する必要がある場合は、代わりに mod_wsgi を使用してください。切り替えるのは難しくありません。これはとても簡単だ。 mod_wsgiは、脳死のmod_pythonよりも Django用に設定 の方が簡単です。

要件からApacheを削除できる場合、それはあなたの記憶にさらに良いでしょう。 spawning は、python Webアプリケーションを実行する新しい高速でスケーラブルな方法のようです。

[〜#〜] edit [〜#〜]:mod_wsgiへの切り替えがどのように「trickyになるかわかりません。 」。これは非常に簡単な作業です。スイッチで発生している問題について詳しく説明してください。

49
nosklo

Mod_wsgiで実行しており、WSGIに準拠しているためと思われる場合は、 Dozer を使用してメモリ使用量を確認できます。

Mod_wsgiの下で、これをWSGIスクリプトの最後に追加するだけです。

from dozer import Dozer
application = Dozer(application)

次に、ブラウザで http:// domain/_dozer/index をポイントして、すべてのメモリ割り当てのリストを表示します。

また、mod_wsgiのサポートの声も追加します。 mod_pythonよりもパフォーマンスとメモリ使用量の点で世界に違いをもたらします。 Graham Dumpletonによるmod_wsgiのサポートは、積極的な開発とメーリングリストのユーザーのインストールの最適化の両方の面で優れています。 curse.com のDavid Cramerは、トラフィックの多いサイトでmod_wsgiに切り替えた後のcpuとメモリ使用量の大幅な削減を示すいくつかのグラフ(残念ながら今は見つからないようです)を投稿しました。いくつかのDjango devsが切り替わりました。真剣に、それは簡単です:)

28
Van Gale

これらは、私が知っているPythonメモリプロファイラーソリューションです(Django関連ではありません):

免責事項:後者には利害関係があります。

個々のプロジェクトのドキュメントでは、これらのツールを使用してPythonアプリケーションのメモリ動作を分析する方法についてのアイデアが得られます。

以下は、いくつかの有用な指針を与える素敵な「戦争物語」です。

14
Pankrat

さらに、既知の漏出装置を使用していないかどうかを確認します。 MySQLdbは、Unicode処理のバグによりDjangoで膨大な量のメモリをリークすることが知られています。それ以外の場合、 Django Debug Toolbar は豚を追跡するのに役立ちます。

5
zgoda

大きなデータオブジェクトへのグローバル参照を保持しないことに加えて、可能な限り、大きなデータセットをメモリにロードしないようにしてください。

デーモンモードでmod_wsgiに切り替え、preforkの代わりにApacheのワーカーmpmを使用します。この後者の手順により、より少ないメモリオーバーヘッドで、より多くの同時ユーザーにサービスを提供できます。

4
Carl Meyer

Mod_wsgiに使用するスクリプト(wsgi.pyと呼ばれ、私のDjangoプロジェクト)のルートに配置します:

import os
import sys
import Django.core.handlers.wsgi

from os import path

sys.stdout = open('/dev/null', 'a+')
sys.stderr = open('/dev/null', 'a+')

sys.path.append(path.join(path.dirname(__file__), '..'))

os.environ['Django_SETTINGS_MODULE'] = 'myproject.settings'
application = Django.core.handlers.wsgi.WSGIHandler()

必要に応じてmyproject.settingsとパスを調整します。 mod_wsgiはデフォルトでは印刷できないため、すべての出力を/ dev/nullにリダイレクトします。代わりにロギングを使用してください。

Apacheの場合:

<VirtualHost *>
   ServerName myhost.com

   ErrorLog /var/log/Apache2/error-myhost.log
   CustomLog /var/log/Apache2/access-myhost.log common

   DocumentRoot "/var/www"

   WSGIScriptAlias / /path/to/my/wsgi.py

</VirtualHost>

これが少なくともmod_wsgiのセットアップに役立ち、違いが生じるかどうかを確認できることを願っています。

3
Staale

キャッシュ:フラッシュされていることを確認してください。何かがキャッシュに格納されるのは簡単ですが、キャッシュ参照のためにGCされることはありません。

Swig'dコード:メモリ管理が正しく行われていることを確認してください。特にサードパーティのライブラリでは、Pythonでこれらを簡単に見逃してしまいます。

監視:可能であれば、メモリ使用量とヒットに関するデータを取得します。通常、特定のタイプのリクエストとメモリ使用量との間に相関関係が見られます。

1

大きなサイトマップ(10.000個のアイテム)を持つDjangoのバグを見つけました。サイトマップの生成時にDjangoがすべてをメモリにロードしようとしているようです: http://code.djangoproject.com/ticket/11572 -Googleがサイトへの訪問を支払うと、Apacheプロセスを効果的に終了します。

1
Emil Stenström