テンプレートの再構築状況を調べるmt-tmpl-testツール

Movable Typeのインストール先ディレクトリの中に、「tools」というディレクトリがあります。
このディレクトリには、コマンドラインで実行するツールがいくつか含まれています。

その1つである「mt-tmpl-test」は、再構築の状況を調べるのに非常に役立ちますので、使い方をご紹介します。
なお、コマンドラインで実行するツールなので、SSH等でサーバーにログインできることが必要です。
今回は、実験用に、JumpBoxのLAMPd環境にMovable Type 5をインストールして、その上でmt-tmpl-testツールを使う方法を紹介します。

1.Text::SimpleTableモジュールのインストール

mt-tmpl-testツールには、各テンプレートタグの処理にかかった時間や、再構築の中で発行したSQLを、出力する機能があります(プロファイル)。
プロファイルの機能を使うためには、PerlのText::SimpleTableというモジュールが必要です。
CPAN等から、Text::SimpleTableモジュールをあらかじめインストールしておきます。

なお、JumpBoxのLAMPd環境なら、以下のコマンドでText::SimpleTableモジュールをインストールすることができます。

sudo apt-get install libtext-simpletable-perl

なお、CPAN等からモジュールをインストールできない環境の場合は、以下の手順を取ることもできます。

  • Movable Typeのインストール先にある「extlib」ディレクトリの中に、「Text」というディレクトリを作ります。
  • CPANからText::SimpleTableモジュールのZipファイルをダウンロードします。
  • Zipファイルを解凍し、その中の「lib」ディレクトリにある「SimpleTable.pm」ファイルを、先ほど作った「Text」ディレクトリにアップロードします。

2.インデックステンプレートのプロファイルの出力

インデックステンプレートを再構築し、そのプロファイルを出力するには、ターミナルを起動してMovable Typeのディレクトリに入り、以下のように入力します。

tools/mt-tmpl-test テンプレートのID --profile

例えば、メインページのインデックステンプレートのIDが10番だとします。
この場合だと、以下のように入力します。

tools/mt-tmpl-test テンプレートのID --profile

なお、LAMPd環境で「/var/data/public/mt5」ディレクトリにMovable Typeをインストールした場合だと、ターミナルに接続した後、以下のコマンドを入力して、Movable Typeのディレクトリに入ります。

cd /var/data/public/mt5

3.ブログ記事アーカイブテンプレートのテンプレートのプロファイルの出力

ブログ記事アーカイブテンプレートのプロファイルを出力する場合は、以下のように入力します。

tools/mt-tmpl-test テンプレートのID --entry ブログ記事のID --profile

例えば、ブログ記事アーカイブテンプレートのIDが11番だとします。
また、IDが100番のブログ記事を使って、ブログ記事アーカイブテンプレートを再構築したいとします。
この場合、以下のように入力します。

tools/mt-tmpl-test 11 --entry 100 --profile

4.カテゴリ別ブログ記事リストテンプレートのプロファイルの出力

カテゴリ別ブログ記事リストテンプレートのプロファイルを出力する場合は、以下のように入力します。

tools/mt-tmpl-test テンプレートのID --category カテゴリのID --archive アーカイブのタイプ --profile

アーカイブのタイプは、MTIfArchiveTypeタグのarchive_typeモディファイアに指定するのと同じ値を使います。

例えば、カテゴリ別ブログ記事リストテンプレートのIDが12番だとします。
また、IDが200番のブログ記事を使って、ブログ記事アーカイブテンプレートを再構築したいとします。
この場合、以下のように入力します。

tools/mt-tmpl-test 12 --category 200 --archive Category --profile

4.月別ブログ記事リストテンプレートのプロファイルの出力

月別ブログ記事リストテンプレートのプロファイルを出力する場合は、以下のように入力します。

tools/mt-tmpl-test テンプレートのID --archive アーカイブのタイプ --profile

アーカイブのタイプは、MTIfArchiveTypeタグのarchive_typeモディファイアに指定するのと同じ値を使います。

例えば、月別ブログ記事リストテンプレートのIDが13番だとします。
この場合、以下のように入力します。

tools/mt-tmpl-test 13 --archive Monthly --profile

なお、再構築の対象となるアーカイブは、最新のブログ記事を含むアーカイブです。
「○○年□□月のアーカイブを再構築する」といった指定はできません。

5.プロファイルを見る

再構築が終わると、以下の3つの情報が出力されます。

  • 再構築結果のHTML
  • テンプレートタグ毎の処理時間
  • 再構築の際に発行したSQL

5-1.テンプレートタグ毎の処理時間

テンプレートタグ毎の処理時間は、以下のように出力されます。

Template Tag Utilization:
.----------+----------------------+--------+---------+--------+--------+-------.
| Time     | Tag                  | Calls  | Avg     | SQL    | Hits   | Miss  |
+----------+----------------------+--------+---------+--------+--------+-------+
| 0.097    | subcatsrecurse       | 56     | 0.002   | 65     | 51     | 45    |
| 0.076    | include              | 38     | 0.002   | 17     | 9      | 8     |
| 0.075    | entrytrackbackdata   | 40     | 0.002   | 51     | 99     | 39    |
| 0.071    | categorycount        | 86     | 0.001   | 56     | 0      | 0     |
| 0.026    | entries              | 2      | 0.013   | 2      | 20     | 10    |
・
・(途中略)
・
| 0.000    | searchstring         | 1      | 0.000   | 0      | 0      | 0     |
'----------+----------------------+--------+---------+--------+--------+-------'
  Total Queries: 245
  Total Build Time: 0.593392

「Time」の列は、個々のテンプレートタグの処理にかかった時間です。
上の例だと、MTSubCatsRecurseタグの処理に0.097秒かかったことが分かります。

「Calls」の列は、個々のテンプレートタグが実行された回数です。
また、「Avg」の列は、個々のテンプレートタグの1回あたりの処理時間です(=Time/Calls)

「SQL」は、そのタグを処理するために発行されたSQLの回数です。
また、「Hits」は、SQLの処理の際にメモリのキャッシュにヒットした回数で、「Miss」はヒットしなかった回数だと思われます。

最後の「Total Queries」は、発行したSQLの合計回数です。
そして、「Total Build Time」は、ページの再構築にかかった秒数です。

この例だと、ページの再構築に約0.593秒かかっていて、その内の0.097秒(約6分の1)をMTSubCatsRecurseタグの処理が占めています。
実験に使ったテンプレートでは、MTSubCatsRecurseタグは、サイドバーにカテゴリ一覧を出力するウィジェットで使っています。
この結果から、カテゴリ一覧のウィジェットをキャッシュすれば、ブログ全体の再構築時間を短縮する際に、効果があると予想できます。

また、MTEntryTrackbackDataタグの処理に0.075秒かかっています。
ページ全体の再構築時間が約0.6秒なので、MTEntryTrackbackDataタグだけで約8分の1の時間を占めていることが分かります。
企業サイトなど、トラックバックを使わない場合なら、このタグを削除すれば、再構築を高速化できることが期待できます。

5-2.再構築の際に発行したSQL

最後に、再構築の際に発行したSQLが出力されます。
この部分は、各種のオブジェクトを読み込むプラグインを作る際に、中でどのようなSQLが発行されるかを調べたい時に使うことができます。

.------------------------------------------------------------------+-----------.
| Query                                                            | Number    |
+------------------------------------------------------------------+-----------+
| RAMCACHE_GET ?                                                   | 500       |
| RAMCACHE_ADD ?                                                   | 128       |
| SELECT COUNT(*) FROM mt_entry, mt_placement WHERE (entry_status- | 56        |
|  = ?) AND (entry_class = ?) AND (entry_blog_id = ?) AND (placem- |           |
| ent_category_id = ?) AND (entry_id = placement_entry_id)         |           |
| SELECT category_id FROM mt_category WHERE (category_parent = ?)- | 56        |
|  AND (category_class = ?) AND (category_blog_id = ?)             |           |
・
・(途中略)
・
| SELECT category_id FROM mt_category WHERE (category_parent = ?)- | 2         |
|  AND (category_class = ?) AND (category_blog_id = ?) ORDER BY c- |           |
| ategory_label ASC                                                |           |
'------------------------------------------------------------------+-----------'

6.注意事項

テンプレートによっては、ときどき再構築に失敗して、正しい結果が出ないことがありました。
例えば、こちらで遭遇した事例では、あるMTIncludeタグでblog_idモディファイアを付けると、その後に出てくるMTIncludeタグにもblog_idモディファイアをつけないと、エラーが起こるという現象がありました。