人気の日記プラグインのバグ
先に結論から
人気の日記プラグインにバグがありました。 (多分いないと思うけど)もしお使いの方がいらっしゃったら、更新をお願いします(差分←trunk/plugin/hatena_bookmark_entry.rbの方です)。
経緯
ここ数日、日記の表示が遅くなっていた。 てっきりアクセスが集中したから(図を参照)…と思い込んでいたけど、今日になっても重いのは変わらない。 こういうときは、自分で作ったプラグインを疑うのが一番の近道、と思って一つずつプラグインを外しながらテスト。 負荷計測には、mput さんの日記に書かれている方法を参考にした。
curl を使って自分の日記にアクセスし、かかった時間を表示する。
$ time curl --silent 'http://www.machu.jp/diary/' > /dev/null real 0m3.716s user 0m0.010s sys 0m0.001s
一つずつプラグインを外しながらチェックしていく。 そして、人気の日記プラグインを外すと…。
$ time curl --silent 'http://www.machu.jp/diary/' > /dev/null real 0m0.551s user 0m0.000s sys 0m0.008s
うわっ。こいつが犯人だったか。 右サイドバーに表示している「人気の日記」も最近更新されていなかったし、変だと思ってたんだ。
調べてみる
$ ls -l ~/var/tdiary/cache/hatena/ total 10720 -rw-r--r-- 1 machu users 10836365 Feb 3 06:25 bookmark.dat -rw-r--r-- 1 machu users 22162 Dec 27 2005 cache-rss.xml -rw-r--r-- 1 machu users 7596 Oct 10 14:29 hatena_bookmark.dat
ちょ…10Mのファイルができてる。 bookmark.dat は、www.machu.jp の注目エントリーの RSS を解析した結果(最近人気になった日記のタイトルとURL)を保存しているPStore形式のファイル。 数KBのデータのはずなのに。
プラグインのソースを読むと、ありえないミスをしていたことに気がつく。
hatena_bookmark_open_cache(cache_path) do |db| db[sort] ||= [] (かなり略) db[sort].push({ :url => url, :title => title }) (略) end
配列は最初に一回作って、後はひたすらデータを追加しているだけだ… orz ここは日記を更新する度に呼ばれるので、日記を書くたびにデータが増えていってたことになる。 これは重いはずだよ。
ということで、
- db[sort] ||= [] + db[sort] = []
と修正し、 bookmark.dat を削除してもう一度速度を計ってみる。
$ time curl --silent 'http://www.machu.jp/diary/' > /dev/null real 0m0.536s user 0m0.008s sys 0m0.001s
うん。直ったみたい。 しかしなぁ…。 さくらインターネットさん、負荷かけてごめんなさいごめんなさい。