MovableType に標準で搭載されている検索用 CGI (mt-search.cgi) は遅い遅いと不評ですが、検索結果をキャッシュすることで爆速化するプラグインを書いてみました。公開された記事が即時に検索対象に含まれる必要のない個人サイトのように、検索結果の内容について即時性を強く求められないケースであれば、運用上十分な効果を期待できます。プラグインのファイルを一つ導入するだけで、mt-search.cgi のパフォーマンスが5~10倍程度に向上します(当サイト計測比)
以前に当サイトで公開した KeyCached プラグインは、そもそもこの検索用 CGI の動作パフォーマンスを少しでも改善する意図で開発しました。この KeyCached プラグインを導入することによって、MovableType テンプレートから検索結果をレンダリングする部分についてはパフォーマンスを改善することができましたが、最大かつ主たるボトルネックであるデータベースへの問合せやパターンマッチ処理についての決定打とはなりませんでした。
今回、作成した SearchResultsCache プラグインでは、mt-search.cgi 内で実際に検索処理を行っているメソッドそのものを乗っ取ってしまいます。もし以前と同じ検索条件で問合せが行われた場合、正直にデータベースへの問合せとテンプレートの構築を行わず、以前に生成された HTML のキャッシュをそのまま返すようにします。そして、同じ検索条件での検索が行われていない場合にのみ、データベースへの問合せを行うようにしました。このキャッシュの生存時間は任意に設定することができるので、各々のサイトの運用に合わせて適切に調整されるべきです。
上記の検索はいずれも静的な URL で表示されていますが、内部的には mod_rewrite を利用して mt-search.cgi が起動されています。この話の続きはまた今度…
プラグインの導入によってどの程度パフォーマンスが改善されるのか簡単に計測してみました。Apache Bench を利用して 10 回の問合せを行った結果は以下の通りです。
SearchResultsCache | 最小[ms] | 中央値[ms] | 最大[ms] | 速度比 |
---|---|---|---|---|
なし | 9,326 | 11,659 | 16,757 | 1.0 |
あり キャッシュなし |
705 | 1,728 | 9,892 | 6.7 |
あり キャッシュあり |
714 | 1,066 | 2,370 | 10.9 |
/ab -n 10 -c 1 http://www.magicvox.net/archive/keyword/MovableType で計測を実施。回数と並列度が低いのは、爆速化されたとは云え、やっぱり mt-search.cgi は重いプログラムに変わりはないため少ない目に。
キャッシュ動作には、以下のCPANモジュールが必要になります。必要に応じてインストールしてください。展開されたファイルのうち拡張子が pm のものを /extlib 以下にコピーすれば動作します。
master
) ... バグ修正や機能追加など開発途中のバージョンです。開発中の新機能などをいち早く利用できますが、新しいバグが生まれていたり、テストが不十分な場合があります。
寄せられたコメント (全 5 件中、最新 5 件まで表示しています)
4.1 をご使用の方は
http://lab.magicvox.net/trac/mt-plugins/browser/SearchResultsCache/tags/1.0.0/plugins/SearchResultsCache/SearchResultsCache.pl
4.15 をご使用の方は
http://lab.magicvox.net/trac/mt-plugins/browser/SearchResultsCache/tags/1.1.0/plugins/SearchResultsCache/SearchResultsCache.pl
をご利用くださいm(_ _;)m
ただ,MT4.15から検索結果を標準でキャッシュする様子なので,ほぼ不要かもしれません。
データベースへの問合せだけでなく,このプラグインが最終的に生成されるHTML全体をキャッシュしてしまうためです。
ですので,データベースの問合せのみをキャッシュできればいいのですが難しいと思います。
表示された人気記事のランキングも一緒にcacheされてしまいますよね?
mt-search.cgi の検索結果だけをcacheできればいいのですが、どうしたらいいのでしょうか?
それとも、hottopic200.php.tmplの読み込み方を工夫すればなんとかなりますか?
他に必要なライブラリがあれば,そのライブラリが足りないとエラーメッセージが表示されていると思います。
環境は Movable Type version 4.1 :: Professional Pack 1.1 です。
パーミッションを755に変えたりしてみましたがダメでした。
pluginsフォルダにアップロードと
* Cache - the Cache interface
* File::NFSLock - perl module to do NFS (or not) locking
* Date::Parse - Parse date strings into time values
も/extlib 以下にコピーしたのですが・・・。