Zopeがフリーズする

先週から起きているウェブの不調。一次的な原因はバックエンドのZopeインスタンスがリクエストに対する回答を返さないこと。単純に観察していると、Zopeが沈黙したように見える。

インスタンスを再起動すると、一旦は復活するもののしばらくすると同じ現象になります。

フロントエンドを遮断して、外部からのリクエストがこないようにすると現象が発生しないことから、なにか外部からの特徴的なリクエストがトリガーになっているものと推測できるのですが、Z2.logなど眺めてみてもどれがきっかけなんだかわかりっこない。

そこでいろいろ調べてみると、Zopeが現在処理しているスレッドの内容をダンプしてくれるツールがあることを発見しました。

DeadLockDebuggerというプロダクトがそうです。このプロダクトを動作させるためにはpythonパッケージのthreadframeが必要です。

treadframeをインストール

上記サイトからダウンロード、展開して
# python setup.py install

DeadLockDebuggerをインストール

通常どおりProductディレクトリへコピー(またはリンク)。プロダクト中の custom.py を編集。

ACTIVATED=True
SECRET='mysecret'

と編集してから、該当Zopeインスタンスを再起動。

スレッドのダンプを参照

スレッドのダンプはこんなURLで見えます。

http://hostname:port_number/manage_debug_threads?mysecret


これでスレッドの状態をチェック。先週から起きている現象は、クローラが検索に該当するURLをバンバンとリクエストしてくれていることが原因と判明しました。
しかも、該当URLはCMSプロダクトのバグで検索範囲がとてつもなく広く指定されているもので、とても回答に時間がかかるものでした。このため、リクエストがどんどんたまってスレッドを食い尽くしているということが判明。
ログだけじゃ解らない情報もあるんだということを認識しました。