出力キャッシュの効果
出力キャッシュの効果
リスト11は、その出力キャッシュのベンチマーク測定のテストスクリプトです。
リスト11:出力キャッシュのテストスクリプト
$sql = "SELECT * FROM zipcode WHERE zip like '100%'";
if (empty($_GET['nocache'])) {
header('Cache-Control: public, max-age=6000');
}
if (empty($_GET['nopagecache'])) {
$cp = '/tmp/'.md5($sql);
// ファイルの更新時間を比較して新しければキャッシュを送信
if (file_exists($cp) && filemtime($cp) > time()-600) {
readfile($cp);
exit;
}
ob_start();
}
$conn = pg_pconnect('host=sena dbname=zipcode user=yohgaki');
$res = pg_query($conn, $sql);
?>
Simple Benchmark
while ($row = pg_fetch_assoc($res)) {
echo '
'.join('
', $row).'
';
}
?>
if (empty($_GET['nopagecache'])) {
$contents = ob_get_clean();
$fp = fopen($cp,'w');
fwrite($fp,$contents);
echo $contents;
}
?>
郵便番号データベースから、上3桁が100番の番号を検索し、表として出力した場合のベンチマークは図24のとおりです。なお、上3桁が100の郵便番号は194件ありました。
| ab -c 100 -n 10000 http://dev/~ohgaki/zip.php?nopagecache=1 |
|
| Requests per second: |
|
| Time per request: |
|
| Time per request: |
|
| Transfer rate: |
|
| ab -c 100 -n 10000 http://dev/~ohgaki/zip.php |
|
| Requests per second: |
|
| Time per request: |
|
| Time per request: |
|
| Transfer rate: |
|
出力キャッシュの有無では、2倍強の高速化しか達成できませんでした。しかし、 Transfer rateを見ると、テストスクリプトが単純であったため、100MbpsのLANがボトルネックになっていることがわかります。より複雑なスクリプトであ ればさらにはっきりとした差を確認できるはずです。
データベースサーバーへの負荷ですが、出力キャッシュを使用していない方ではデータベースサーバーが同じレコードを繰り返し検索して、100%近く CPU時間を使用していました。それに比べて、出力キャッシュを使用しているケースは、負荷がほとんどない状態(CPU時間が10〜15%)においては、 当然ですが、データベースへのアクセスは0でした。
次回はHTTPキャッシュの効果を測定します。
?>