Zopeがフリーズする
先週から起きているウェブの不調。一次的な原因はバックエンドのZopeインスタンスがリクエストに対する回答を返さないこと。単純に観察していると、Zopeが沈黙したように見える。
インスタンスを再起動すると、一旦は復活するもののしばらくすると同じ現象になります。
フロントエンドを遮断して、外部からのリクエストがこないようにすると現象が発生しないことから、なにか外部からの特徴的なリクエストがトリガーになっているものと推測できるのですが、Z2.logなど眺めてみてもどれがきっかけなんだかわかりっこない。
そこでいろいろ調べてみると、Zopeが現在処理しているスレッドの内容をダンプしてくれるツールがあることを発見しました。
DeadLockDebuggerというプロダクトがそうです。このプロダクトを動作させるためにはpythonパッケージのthreadframeが必要です。
treadframeをインストール
上記サイトからダウンロード、展開して
# python setup.py install
DeadLockDebuggerをインストール
通常どおりProductディレクトリへコピー(またはリンク)。プロダクト中の custom.py を編集。
ACTIVATED=True SECRET='mysecret'
スレッドのダンプを参照
スレッドのダンプはこんなURLで見えます。
http://hostname:port_number/manage_debug_threads?mysecret
これでスレッドの状態をチェック。先週から起きている現象は、クローラが検索に該当するURLをバンバンとリクエストしてくれていることが原因と判明しました。
しかも、該当URLはCMSプロダクトのバグで検索範囲がとてつもなく広く指定されているもので、とても回答に時間がかかるものでした。このため、リクエストがどんどんたまってスレッドを食い尽くしているということが判明。
ログだけじゃ解らない情報もあるんだということを認識しました。