Djangoのメモリ使用量の削減。容易に解決できる問題?


136

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

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

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

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

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

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

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

編集:カールは、ここに読む価値がある少し詳細な返信を投稿しました:Djangoデプロイメント:Apacheのオーバーヘッドの削減

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

最終編集:まあ、私はこれをWebfactionと話し合って、Apacheの再コンパイルを支援できるかどうかを確認してきました。

「MPMワーカー+ mod_wsgi設定に切り替えることで、多くのメリットが得られるとは思いません。20MB程度節約できると思いますが、それ以上ではないでしょう。」

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

皆様のご協力に感謝しますが、この質問はまだオープンだと思います!

別の最終編集;-)

私はdjango-usersリストでこれを尋ね、いくつかの非常に役立つ返信を得ました

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

これはリリースされたばかりです。:まだ最善の解決策かもしれないPymplerでのプロファイリングDjangoのオブジェクトのサイズやメモリ使用量

回答:


50

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

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

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

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


4
@Josh:Apacheのみの機能を使用していない場合、Apacheの肥大化とメモリ使用量は愚かです。それは単に不必要なレイヤーです。
nosklo 2009年

3
Djangoはまだmod_pythonを支持しています。なぜならmod_wsgiはまだかなり新しく、保守的であることを望んでいるからです。しかし、Djangoコミュニティをフォローすると、人々が一斉にmod_wsgiに切り替えているのがわかります。推奨されるオプションになるまで、それほど時間がかかりません。
カールマイヤー

1
@Tiago:apacheは、すでに多くのapache仮想ホストが配置されている場合や、apacheでSSLを使用している場合などに適しています。この場合は、mod_wsgiを使用します。新たに開始する場合は、スポーンを使用してください。mod_pythonは絶対に使用しないでください。
nosklo 2009年

1
ありがとう、nosklo。私はスポーンを調べています。ドキュメントがほとんどないようです。ブログの投稿で見つけたいくつかの指示に従い、どこで入手できるかを確認します。
ティアゴ

1
うーん、誰かがDjangoを使い始めたばかりなので、私はmod_wsgiを使うべきだということを覚えておきます。
パワーロード2009年

28

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開発者が切り替えました。真剣に、それは非常に簡単です:)


その場合、静的ファイルにアクセスするdjangoユーザーにCookieベースの認証を取得する方法を尋ねる質問をすぐに投稿します...
Andy Baker

15

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

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

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

以下は、いくつかの有用な指針を与える素晴らしい「戦争の話」です。


5

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


amix.dk/blog/viewEntry/19420は、MySQLdbがメモリをリークしていることを示すためにドーザーが使用されていることを示しています。MySQLdb 1.2.3c1以降ではこれが修正されています。
msanders 2009年

どのようにdjango-debug-toolbar役立つでしょうか?
Wtower、2015年

4

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

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


また、ここではカールの回答を参照してください。stackoverflow.com/questions/488864/...を
アンディ・ベイカー

また、私が読んだいくつかの投稿では、mod_wsgiを使用するのではなく、ワーカーMPMに切り替えるほうが本当のメリットがあるようです...
Andy Baker

4

Webfactionには djangoのメモリ使用量を抑えるためのヒントが実際にあります

主なポイント:

  • デバッグがfalseに設定されていることを確認してください(すでに知っています)。
  • Apache設定で「ServerLimit」を使用します
  • 大きなオブジェクトがメモリに読み込まれていないことを確認します
  • 別のプロセスまたはサーバーで静的コンテンツを提供することを検討してください。
  • Apache設定で「MaxRequestsPerChild」を使用します
  • 使用しているメモリ量を調べて理解する

2
おかげで、私はすでにそれらを読みました。3と6です。もう少し詳しく知りたいと思っていました。;-)
アンディベイカー、

3

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

しかし、あなたが場合でも行うユーザーに割り込みサービスにせずに、大きくなりすぎからプロセスのサイズを維持する必要がありますメモリリークを持っています。


1
同様のものがここで言及されています:mail-archive.com/django-users@googlegroups.com/msg84698.html 彼らだけがmaximum-requestsの代わりにinactivity-timeoutを使用しました。
Tomas Andrle、2010

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とパスを調整します。すべての出力を/ dev / nullにリダイレクトします。これは、デフォルトでmod_wsgiが印刷を妨げているためです。代わりにロギングを使用してください。

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


1

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

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.