ZAPAnet総合情報局 > ZAPAブログ2.0 > Nucleusを半分やめて、100倍速を実現しました!

Nucleusを半分やめて、100倍速を実現しました!

2007年04月09日 プログラミングTIPS
ライブドアブログからの移転以来、今までNucleusというCMSツールを使ってブログを投稿してきましたが、思い切って半分やめることにしました。

理由は、「なぜか処理に時間がかかるから」です。

最近ページを開くのに、どうも以前よりも処理が遅くなったような気がしていました。
高橋名人の今と昔」がYahoo! JAPANのニュース記事からリンクを貼られたときも、重くて開けなくなりました。
サーバーのスペックの問題かといえば、pukiwikiサイトを50万PV/day動作させられるサーバーですから、サーバー性能的な問題ではありません。

処理に時間がかかる原因を、「Nucleusの内部的な処理と、追加したプラグインの処理」だと断定し、ブログ表示処理をごっそり書き換えることにしました。
Nucleusを改良したのではなく、ガリガリと0から全てプログラミングしてみました。

各種CMSツールについて

CMSツールといえば、Movable TypeWordPressXOOPSが日本で圧倒的な人気を誇っています。

ライブドアブログから移転する際、試しにMTをインストールしてみたことがありますが、記事数が増えたときの再構築にかかる負荷があまりにも高くてガッカリしました。
一度再構築が済めば、HTMLとして静的なページを配信できる利点はありますが、マイナス面があまりにも大きいため導入しませんでした。

XOOPSはコミュニティサイトを作る際に便利そうですが、どのサイトでも処理が重そうな動きをしているのと、ブログツールとしては大袈裟すぎるので見送りました。

その点、Nucleusは本体自体が軽量で、豊富なプラグインをインストールして自分の好きなように拡張できることから、今まで[Z]ZAPAブロ~グ2.0でも利用してきました。

最近では、WordPressが人気を誇っていて、試しにインストールしてみたこともありますが、なかなかの動作で人気があるだけのことはあると感じました。
ちょっと触れた感じでは、Nucleusよりは少し重そうな動きでした。

Nucleusの処理時間の計測

処理が遅くなったような気がする」だけでは、どの程度時間がかかっているのか、数値的に把握できません。
そこで、Nucleusがブログのページを生成するのにかかる時間を計測してみました。
クライアント側で表示されるのにかかる時間ではなく、DBからデータを読み出し、HTMLを生成するまでの時間の計測です。

表示ページ/回数 1回目 2回目 3回目 4回目 5回目
TOPページ 0.51341秒 0.45078秒 0.40248秒 0.40502秒 0.43092秒
エントリページ 0.41894秒 0.41064秒 0.40777秒 0.42866秒 0.48229秒

結果は上表のようになりました。
TOPページを1ページ生成するのに、平均で0.45秒程度かかっていました。
TOPページもエントリページもそれほど生成時間に差がないことから、「Nucleusの内部的な処理か追加したサイドバーのプラグイン処理」のどちらかに、サーバーに負荷を与える処理が含まれていると考えられます。
サイドバーには、最新コメント一覧やカテゴリ別記事数一覧のプラグインなどがあるので、この辺りが怪しそうでした。

Nucleusの内部プログラム数十ファイルと、各プラグインのソースを追っていけば原因も掴めそうですが、それはそれで時間がかかってしまうので、今回はブログ表示処理をごっそり書き換えることにしました。

ブログ表示処理を自分でプログラム

Nucleusを全てやめて、全て自前でブログシステムを構築することもできますが、どうせなら今あるNucleusのデータを利用した方が簡単です。
そこで、データベース自体はいじらず、表示部分だけを自分でプログラミングすることにしました。

データベース接続方法、処理方法などは
PDO、PEAR::DB、MySQL関数の速度比較
で調査済みです。
今回は、PHPとPDOでMySQLのデータベースを処理して表示させることにしました。

TOPページ、個別アイテムページ(各エントリページ)、カテゴリ別ページ、月別ページをそれぞれ設計しました。

☆カテゴリについて
カテゴリについては、DBから全ての情報を毎回取得する方法も考えました。
しかし、Nucleus自体が内部でカテゴリの並び順を保持していないため、今回はプログラムの設定ファイル自体に配列として情報を持たせました。
カテゴリ数が増えたときに若干設定行為が増えますが、もうすでに十分カテゴリが多いのと、処理速度を優先して配列データとしました。

☆コメントについて
コメント機能は、搭載するかどうか迷いましたが、これからは”無し”でいこうと思います。
ブログにコメント機能があるのは、読者との交流を持てる利点がありますが、同時にコメントに対する返信とスパムへの対応の欠点を持ち合わせています。
今まで、Web拍手経由でのメッセージやメールフォームからメールを送ってくれる人も多く、はてなブックマークなどでコメントしてくれる方も多くいました。
今後は、コメント機能は廃止し、Web拍手経由でのメッセージやメールフォームからのメールに統一します。

☆トラックバックについて
トラックバック機能は、そのまま”あり”にしました。
自前でプログラムを組むのは面倒なので、Nucleusのプラグインをそのまま使わせてもらっています。


今回、プログラムをしたのは以上「ブログ表示処理部」のみです。
ブログ投稿処理は全て今までと同様、Nucleusの機能を使っています。
RSSの生成、表示も今までと同じです。
それで、「Nucleusを半分やめた」という表現にしました。

自分で作ったプログラムの処理時間計測

さて、苦労してできあがった自前のブログ表示処理プログラムの処理時間を計測してみます。
もし、自分で作ったプログラムがほとんど速くなっていなかったら、完全に骨折り損のくたびれもうけになります。

結果は…

表示ページ/回数 1回目 2回目 3回目 4回目 5回目
TOPページ 0.00453秒 0.00455秒 0.00467秒 0.00446秒 0.00460秒
エントリページ 0.00203秒 0.00210秒 0.00203秒 0.00201秒 0.00225秒

TOPページを1ページ生成するのにかかる平均の処理時間は、
旧システム:0.4500秒
 ↓↓↓
新システム:0.0045秒
となりました。

なんと、100倍も速くなりました!
(エントリページでは、200倍速を実現!)

予想以上の処理速度改善に、自分自身でも驚きました!
2桁も処理時間が変わってしまうなんて、今までどんな処理をしていたのか、むしろそちらも気になってしまいます。

WordPressXOOPSNucleusなど、プラグインで豊富に拡張できるCMSツールが流行る一方、こうした処理速度UPの方向で動いている人たちは少ないように感じます。
豊富な拡張機能よりも、軽量・高速なツールを目指すのも大切なことだと思います。

今回、自分でプログラムを組んだことで、今までプラグインでしか表現できなかったことも簡単に実現できるようになりました。
ページ上部にある「パンくずリスト」や「月別記事リンクの表示方法」などがそれに当たります。
欲しい機能を実現できるプラグインを探したり、バージョンアップの確認をしたり、それぞれのプラグインの使い方を覚えたり…といった面倒な行為からも解放されました。
これからは、自分で付けたい機能を自分で搭載すればOKになります。

何よりも、今までと違ってサクサクと動作するのが良いですね。
実際に新ステムで動作している「[Z]ZAPAブロ~グ2.0」を動作させてみて、どのように感じたでしょうか?

ブログデザイン変更について

ついでなので、ブログのデザインも変更しました。
誰のためのWebデザイン変更ですか?
を投稿したのも、このブログのデザインを変更する前の考察記事だったからです。
今回は完全に「自分のためにWebデザインを変更する」が当てはまります。
プログラムを変更して、気分も一新したくてデザインも変更しました。

サイドバーが右から左へと変更になっています。
ブログでは、どちらかというと右側にサイドバーがあるのが一般的です。
ブログ記事本文を先に表示するために、サイドバーを後にHTMLとして記述する例が良く見られます。
また、「記事ベース」でブログを見た場合に、左上に本文が合った方が読みやすいという理由もあります。

RSSリーダー、ニュースサイト、ブックマーク、リンク集などが流行したことにより、
ブログ全体として読まれるのではなく、エントリだけが読まれる
行為を、ブロガー自身が助長している結果でもあると思います。

そこで、今回のデザインでは左のサイドバーにカテゴリを表示して、「カテゴリベース」で読んでもらえるように配慮してみました。
左にあろうが右にあろうが、どうせ「エントリ」自体しか読まれない可能性は高いだろうと思います。
でも、このブログに興味を持ってくれた方が、少しでも読みやすく「カテゴリ」別に読んでもらえるように表示してみました。

おかしな部分などありましたら、教えていただけると助かります。

機能面でのまとめ

機能面で今までのシステムと新しいシステムの違いなどをまとめておきます。
処理速度は100倍速になった!
パンくずリストの性能がアップした
コメント機能は”無し”にした
メッセージは、Web拍手、メールフォームなどを利用してもらうようにした
トラックバック機能は引き続き使えるようにした
検索は、Googleの検索フォームを利用する方法に変更した
カテゴリ別に読みやすくした
RSSは今までと同じにした
ブログ投稿機能は引き続きNucleusの機能を利用するようにした
ケータイからの表示対応はやめた(利用者がほとんどいなかったため)
何かおかしなところや、今まで使えていたのに無くなってしまった部分などに気付きましたら、ご連絡ください。


それでは心機一転、これからも[Z]ZAPAブロ~グ2.0をお願いします。
(なお、[Z]ZAPAブロ~グ2.0から、2.1や3.0にはしませんでした)



追記1:ケータイ電話に対応させました&mobile向けTIPS
追記2:メッセージフォーム設置しました
追記3:Google AJAX Feed APIを導入しました