cakephp、パフォーマンスチューニングメモ

· apache, application

cakephpで構築中のサービスに、パフォーマンスチューニングを行った際、効果がどれだけあったかをメモしておきます。

なお、実行環境はこちら(http://www.rapidsite.jp)のVPS(仮想専用サーバ)のお試しプランで実施しました。

<(web + DB)サーバスペック>

CPU:Intel Xeon 2.8GHz x 2(共有)

メモリ:512MB

実施内容は、こちら(amazon:PHPで作る携帯サイトデベロッパーズガイド)を参考に3つの方法で行いましたが、まずは何もしない状況から一つづつ実施していって、その変化を見ていきました。

実施内容は以下。

  • APC導入

  • DBキャッシュ

  • viewキャッシュ

準備

パフォーマンスの計測方法ですが、apache bench(ab)とcakephpに導入した処理時間計測コンポーネント(Benchコンポーネント)で計測しました。2つの使い分けですが、

  • abでは、同時にリクエストがきた場合の処理時間

  • Benchコンポーネントでは、1リクエストの処理時間

となります。

初め

VPS環境に、ソースをまるっと移行しただけの状態で計測します。

その結果ですが、abは、

$ab -n 100 -u 100 http:://ドメイン/index.php

・・・(省略)・・・

Requests per second: 1.40 [#/sec]

・・・(省略)・・・

100クライアントから100回のリクエストを受けた想定で行い、1秒あたりにこなした数が1.40という結果になりました。

ちなみに、index.phpが返すhtmlを静的なファイルindex.htmlとして用意し、試した場合、

$ab -n 100 -u 100 http:://ドメイン/index.html

・・・(省略)・・・

Requests per second: 3627.13 [#/sec]

・・・(省略)・・・

まあ早いw 桁が違いすぎますねw これだけ違う理由は、まず単純にhtmlとphpの違いもありますが、cakephpというフレームワークの実行に負荷がかかっているのでしょう(それに私が導入したライブラリの使い方が非効率なところも・・・(汗))。

続いては、Benchコンポーネント

0.0000 : これは、簡単に言うと、処理の最初から終わりまでかかった時間を5つのステップで計測しています。全体では約0.36秒かかったということです。

APC導入

APCの導入方法は割愛しますが、単純にインストールしただけで、パラメータはデフォルトのままです。

ab結果、

Requests per second: 3.20 [#/sec]

お、1.40と比較すると倍以上になりましたね。

続いてBenchコンポーネント結果、

0.0000 : 初めの4ステップは0.04秒ほど早くなって改善が見られますね。最後のステップの変化が僅かなのが少し気になりますがw

DBキャッシュ

このキャッシュは、cakephpのcacheクラスを利用した方法です。

計測対象のページで走っている2本のSQL(一覧を取得するようなもの)があるのですが、その結果は頻繁に更新されないのでキャッシュすることにしました(どちらもそれほど重くはないSQLです)。つまり、キャッシュされたあと、しばらくはこの2本のSQLは実行されません。

ab結果、

Requests per second: 6.20 [#/sec]

お、さらに倍になりました。

Benchコンポーネント結果、

0.0000 : 実は、この3行目と4行目の「get ~ list」の手前でSQLが動いていたのですが、今回はそれらのSQLを投げずにキャッシュが利用されたため、かなりの改善が見られます。

viewキャッシュ

前回のエントリーでも書きましたviewキャッシュです。

cakephpに用意されているHelper::cacheを利用するわけですが、これで生成されたキャッシュを読む場合、Benchコンポーネントすら実行されません。そこで今回はabのみですが、

Requests per second: 22.65 [#/sec]

という結果でした。最初(1.40)に比べると15倍ぐらいにはなったでしょうかw

まとめ

abは、初め→1.40、APC導入→3.20、DBキャッシュ→6.20、viewキャッシュ→22.65 となりました。

Benchコンポーネントは、初め→0.36(s)、APC導入→0.35(s)、DBキャッシュ→0.28(s)、viewキャッシュ→(未計測)(※ただし別の方法で計測すると、0.04(s)という結果でした)となりました。

APCのパラメータ調整や、htmlページの部分的なキャッシュ等、まだまだ細かいチューニングは出来る余地はあるとは思いますが、これら3つの対策でどれだけ効果が期待できるのかの目安にはなったかと思います。

まだ開発中のサービスなので、運用が始まったらこの数値を参考にしながら、対策を練っていきたいと思います。