テール可能なカーソルを使用して、上限のあるコレクション (mongodb) を実行しています。突然、20〜300秒後、CPUが100%にジャンプし、mongostatがgetmore
完全に停止するまで、正常に動作します。
PythonスクリプトでcProfileを実行したところ、次のことがわかりました。
1 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}
77 0.000 0.000 0.000 0.000 {method 'match' of '_sre.SRE_Pattern' objects}
11 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}
34 242.726 7.139 242.726 7.139 {method 'poll' of 'select.epoll' objects}
12 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}
したがって、epoll はここで明らかに際立っていますが、他のすべては正常に見えます。これがハングアップと CPU の大混乱の原因である可能性があります。
しかし、それはどういう意味ですか?(おそらくここにヒントがありますか?) 何が起こっていて、どうすれば修正できますか?
これは、epoll をトリガーする可能性が最も高いコードです。
while WSHandler.cursor.alive:
try:
doc = WSHandler.cursor.next()
これは別のスレッドで実行されます (を使用threading.thread()
)。
(Tornado WebSocket、db に挿入するための 3 つの mongodb スクリプト、およびカーソルをテーリングするための 1 つのスクリプトを使用しています。cProfile はテーリング スクリプトからのものです。)