139

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

メモリ使用量のプロファイルを作成する方法がわかりませんが、測定を開始する方法に関するいくつかのヒントが役立ちます。

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

誰でも他の人を提案できますか?トラフィックの少ないサイトでキャッシングを行うと、どの程度改善されるでしょうか?

この場合、mod_python を使用して Apache 2.x で実行しています。mod_wsgi の方が少しスリムだと聞いたことがありますが、大幅な改善が見込めない限り、この段階で切り替えるのは難しいでしょう。

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

また、前述のように、mod_wsgi への切り替えを難しくする要因がいくつかあるため、その方向に進む前に、期待できる利点を把握しておきたいと思います。

編集:カールは、読む価値のあるもう少し詳細な返信をここに投稿しました: Django Deployment: Cutting Apache's Overhead

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

最終編集: Webfaction とこれについて話し合って、Apache の再コンパイルを支援できるかどうかを確認しました。これが問題に関する彼らの言葉です。

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

そう!これにより、元の質問に戻ります (これについてはまだよくわかっていません)。問題がどこにあるかを特定するにはどうすればよいでしょうか。どこを最適化する必要があるかを確認するためにテストせずに最適化しないというのはよく知られている格言ですが、Python のメモリ使用量を測定する方法に関するチュートリアルはほとんどなく、Django に固有のものはまったくありません。

みんなの助けに感謝しますが、この質問はまだ開いていると思います!

別の最終編集;-)

これを django-users リストで質問したところ、非常に役立つ回答が得られました

正直、今までで最後の更新です!

これは発売されたばかり。まだ最良の解決策かもしれません:Pymplerを使用したDjangoオブジェクトのサイズとメモリ使用量のプロファイリング

4

10 に答える 10

50

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

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

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

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

于 2009-01-28T11:11:14.943 に答える
28

mod_wsgi で実行していて、おそらく WSGI に準拠しているためスポーンしている場合は、Dozerを使用してメモリ使用量を確認できます。

mod_wsgi の下で、これを WSGI スクリプトの最後に追加します。

from dozer import Dozer
application = Dozer(application)

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

また、mod_wsgi に対する支持の声も追加します。mod_python と比べて、パフォーマンスとメモリ使用量の面で大きな違いがあります。mod_wsgi に対する Graham Dumpleton のサポートは、積極的な開発と、メーリング リストに参加している人々がインストールを最適化するのを支援するという点で、際立っています。curse.comの David Cramer は、トラフィックの多いサイトで mod_wsgi に切り替えた後、CPU とメモリの使用量が大幅に減少したことを示すいくつかのグラフを投稿しました (残念ながら現在は見つかりません)。django 開発者の何人かは切り替えました。真剣に、それは簡単です:)

于 2009-02-01T20:18:57.733 に答える
15

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

免責事項:私は後者に出資しています。

個々のプロジェクトのドキュメントを参照すると、これらのツールを使用して Python アプリケーションのメモリ動作を分析する方法がわかります。

以下は、いくつかの役立つヒントを提供する素晴らしい「戦争の話」です。

于 2009-02-06T19:55:59.537 に答える
5

さらに、既知のリーカーを使用していないかどうかを確認してください。MySQLdb は、Unicode 処理のバグにより、Django で大量のメモリをリークすることが知られています。それ以外に、Django Debug Toolbarは豚を追跡するのに役立つかもしれません。

于 2009-02-04T21:22:05.030 に答える
4

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

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

于 2009-01-28T16:13:18.190 に答える
3

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の設定に役立ち、違いが生じるかどうかを確認できます。

于 2009-02-06T07:09:02.347 に答える
3

mod_wsgi のもう 1 つの利点:ディレクティブにmaximum-requestsパラメーターを設定するWSGIDaemonProcessと、mod_wsgi はデーモン プロセスを頻繁に再起動します。Django とアプリケーション コードをメモリにロードするため、最初に新しいプロセスがヒットしたときにページの読み込みが遅くなる以外に、ユーザーに目に見える影響はありません。

ただし、メモリ リークが発生した場合でも、ユーザーへのサービスを中断することなく、プロセス サイズが大きくなりすぎないようにする必要があります。

于 2009-01-30T20:23:11.657 に答える
1

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

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

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

于 2009-02-04T04:31:53.260 に答える
1

大きなサイトマップ(10.000アイテム)でDjangoのバグに遭遇しました。Djangoは、サイトマップを生成するときにそれらすべてをメモリにロードしようとしているようです:http ://code.djangoproject.com/ticket/11572-Googleがサイトにアクセスすると、apacheプロセスを効果的に強制終了します。

于 2011-01-13T19:37:37.737 に答える