at posts/single.html

人気の日記プラグインのバグ

先に結論から

人気の日記プラグインにバグがありました。 (多分いないと思うけど)もしお使いの方がいらっしゃったら、更新をお願いします(差分←trunk/plugin/hatena_bookmark_entry.rbの方です)。

経緯

burst traffic ここ数日、日記の表示が遅くなっていた。 てっきりアクセスが集中したから(図を参照)…と思い込んでいたけど、今日になっても重いのは変わらない。 こういうときは、自分で作ったプラグインを疑うのが一番の近道、と思って一つずつプラグインを外しながらテスト。 負荷計測には、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

うん。直ったみたい。 しかしなぁ…。 さくらインターネットさん、負荷かけてごめんなさいごめんなさい。

関連する日記