最近、全く開発はしていませんが Ticket#66: CPUリソースを占領する だけは調査していたりします。
手元のサーバ(Linux x86 + Mono 2.4.2.3) でも再発したので常設ノードに影響が及ぶためです。
以下に調査結果を原因判別までの道のりを示してみます。
- およそ1時間ぐらい動かすと、CPUリソースを食い尽くすことが判明
- バグを探してみると#66を発見
- CPUリソースを食い尽くすと、一部のページのみHTTP500を返すことが判明
- HTTPサーバの内部例外をダンプしてみると、XSLTファイルのオープンに失敗していることが判明。どうやらIOハンドル数が多すぎるとかいう内容なので、ファイルハンドルを大量に抱え込んだまま閉じていないだろうということが原因かと思われる
- XSLT周りなどを調べたが、ファイルハンドルが閉じられない可能性がある部分が見つからず。
- よくよく例外をみてみると、SQLiteのデータベースのオープンに失敗していることが判明。もしかして、SQLiteのコネクション数が多すぎて死んじゃう感じ?(データベースを開くときにもファイルハンドルを利用するため)
- でも、コネクションが閉じられない可能性がある部分が見つからず…
- あ、コネクションプーリングあたりがバグってる? ということで、プーリングを無効にしてみた
- 今のところ正常に動作中
むぅ…Mono.Data.Sqlite.dll にバグがあるのかなぁ。でも時間がないのでまだ未調査。
19:06追記:
しかーし、再びCPUリソースを食い尽くしていた…orz
何が原因なんだろう…
ところで、NATやファイアウォールの設定をしていない方が3ノード程いらっしゃいますよ~ と言ってみる。