0

私はしばらくの間、cherrypyのメモリの問題を検出しようとしました。関数へのWeb呼び出しはすべて、次のコマンドを実行すると次のようなメモリを使用します。

ps -u djotjog -o pid,rss,command | awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'

永久に使い果たされたままのようです。終了する前に、関数内のすべてのオブジェクトを「del」しようとしました。無効。大量のデータを格納するクラスインスタンスが問題になるのではないかと思っていました。私は次のようなものを使用します:

class Data:
    pass
ref_data = Data() 

... do stuff... make a stories_dict ...

ref_data.stories = stories_dict #dictionary 'id':'story' pairs
del stories_dict

結局、Web呼び出しを実行するたびに350MBがまだ使用されていることがわかり、500MBに達すると、別のcherrypyインスタンスが生成されるようです。

  PID   RSS COMMAND
10492   960 ps -u globamh1 -o pid,rss,command
10493   784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}
29833  1708 -bash
Total 3.37109 MB

後で...

  PID   RSS COMMAND
12811  1164 /bin/sh cherryd.fcgi
12817 293788 /home4/globamh1/python-2.7.2/bin/python2.7     /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app
13195   984 ps -u globamh1 -o pid,rss,command
13196    16 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}
29833  1708 -bash
Total 308 MB

後でまだ...

  PID   RSS COMMAND
 4053  5216 /home/globamh1/python-2.7.2/bin/python /home/globamh1/python-    2.7.2/ngo_prompter_2.py
 4091   988 ps -u globamh1 -o pid,rss,command
 4092   784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}
12817 1111616 /home4/globamh1/python-2.7.2/bin/python2.7    /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app
29833  1716 -bash
32413  1168 /bin/sh cherryd.fcgi
32414 576792 /home4/globamh1/python-2.7.2/bin/python2.7 /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app
Total 1658.48 MB

したがって、これをいくつかの特定の質問にまとめます。

  • Pythonのガベージコレクターはどのくらいの速さで動作する必要がありますか?
  • CherrypyまたはApacheは、データを永続的に保つために何か奇妙なことをしますか?
  • 大量のメモリを使用している場合、cherrypyが複数のリクエストに応答することをどのように信頼できますか?いくつかのリクエストを無視していることはすでにわかりました。
  • これはサーバー構成の問題ですか?

これは同じ問題ですか? Linux上のpythoncherrypyアプリケーションによって解放されないメモリ

はいの場合、共有ホスティングサイトでそのソリューションを構成するにはどうすればよいですか?

4

1 に答える 1

1

表示されているサンプルコードから、収集するものはほとんどありません。特に:

ref_data.stories = stories_dict

これにより、ref_data.storiesとstories_dictの両方が同じ大きなデータセットを参照するようになります。stories_dictを削除しても、ref_data.storiesは同じdictへの参照であるため、ref_data.storiesが削除される(またはref_dataが削除される)までガベージコレクションされません。

del ref_data.stories # remove the attribute
del ref_data # delete the instance and all of its attributes

それ以外の場合、stories_dictが削除されたときにガベージコレクションされるのは、そのディクショナリへのポインタ(おそらく数バイト)だけです。

Pythonのガベージコレクターはどのくらいの速さで動作する必要がありますか?

保証があるかどうかはわかりませんが、私の経験では、ガベージコレクターは、オブジェクトがdel編集されたとき、または関数が終了したときにすぐに実行されます。

CherrypyまたはApacheは、データを永続的に保つために何か奇妙なことをしますか?

私はそうは思わない。インタプリタから直接同じルーチンを実行した場合、この動作は見られませんか?

大量のメモリを使用している場合、cherrypyが複数のリクエストに応答することをどのように信頼できますか?いくつかのリクエストを無視していることはすでにわかりました。これはサーバー構成の問題ですか?

アプリケーションが基本的に、リクエストが並列処理される場合にシステムが使用できるよりも多くのメモリを使用する場合、リクエスト間で応答を同期する方法を見つける必要があります。もう1つのオプションは、一度に1つのリクエストのみを処理するようにapache/cherrypyを構成することです。これはWSGI構成(割り当てるプロセス/スレッドの数)の一部だと思います。プロセス/スレッドの数を1に制限すると、CherryPyは一度に1つのリクエストのみを処理します。

于 2012-11-22T02:01:35.313 に答える