静的と動的の負荷の差

Movable Typeの特徴の1つとして、静的に再構築を行って、ファイルを出力しておくことができる点があります。
動的出力専用のCMSが多い中で、特殊な存在だと言えます。

再構築による静的出力のメリットは、動的出力に比べて、ページにアクセスがあった時の負荷がきわめて軽いという点があります。
では、静的出力と動的出力とでは、どのぐらい負荷の差があるのでしょうか。
簡単な実験を行ってみました。

1.ほぼ静的に近い場合

まず、静的出力されたページに、以下のようなPHPのコードを組み込んで、ページの先頭から最後までをPHPで処理するのに、どの程度時間がかかるかを出力するようにしてみました。
PHPのコードを入れたので静的なページではなくなりますが、行っている処理はごくわずかなので、ほとんど静的に近いです。

・ページの先頭に追加するコード

<?php $t1 = microtime(true); ?>

・ページの最後に追加するコード

<?php
$t2 = microtime(true);
print 'time = ' . ($t2 - $t1);
?>

ページを10回読み込みなおして、かかった時間の平均を調べてみると、0.28ミリ秒(1ミリ秒=1,000分の1秒)でした。

2.DynamicMTMLを通す

次に、DynamicMTMLの処理を通してみて、その時間を測定してみました。
DynamicMTMLの処理を行うPHPの先頭と、テンプレートの最後に、1.で行ったのと同じような処理を追加して、処理時間を測定してみました。
ただし、DynamicMTML用のテンプレートタグは追加せず、静的なページをDynamicMTMLに通すだけにして、データベースへのアクセスが極力発生しないようにしました。

ページを10回読み込みなおして、かかった時間の平均を調べてみると、98.44ミリ秒でした。
ほぼ静的な場合と比較して、およそ350倍もの処理時間がかかっています。

3.ページ全体を動的に出力する

さらに、テンプレート全体をMTDynamicMTMLタグで囲んで、ページ全体を動的に処理するようにしました。
すると、かかった時間の平均は、573.96ミリ秒になりました。
ほぼ静的な場合と比較すると、およそ2,000倍もの処理時間がかかっています。
また、DynamicMTMLを通すだけの場合と比較しても、6倍弱の処理時間がかかっています。

DynamicMTMLを通すだけだと、ほぼオンメモリで処理が終わると思われます。
一方、ページ全体を動的に処理すると、大量のデータベース読み込みが発生します。
データベース読み込みは、ファイルの読み込みを行う処理です。
ファイルアクセスはメモリアクセスよりも時間がかかりますので、オンメモリで処理するのに比べると、はるかに重い処理になります。

4.静的出力も活用したい

最初に述べたように、現在では動的出力専用のCMSが多いと思います。
しかし、今回の記事の結果を見ても分かるように、動的出力は静的出力と比べて、ページアクセス時の負荷がはるかに大きいです。
今回はMovable Typeを例にとりましたが、他の動的出力のCMSでも、ページアクセス時の負荷は、静的出力の数十倍~数百倍になると思われます。

アクセスが少ないサイトなら、静的出力の数十倍~数百倍の負荷になったからと言って、サイトがアクセス不能になったりするようなことはめったにないでしょう。
アクセスの多い時間帯に、表示が重くなる程度で済むと思います。

しかし、アクセスが大量にあるサイトだと、動的出力するには、負荷対策を考える必要が出てきます。
共有サーバーではなく専用サーバーにしたり、さらにはサーバーを複数台に分散したりすることになるでしょう。
そうなると、サイト運営のランニングコストがかかることになります。

サイト全体を動的出力にすれば、管理は楽になります。
しかし、負荷のことを考えると、サイト全体を動的出力にするのでなく、静的出力もうまく組み合わせることが重要だと思います。