unoh.github.com

PHPで書かれたwebサービスを高速化する2

Fri Jun 02 07:05:06 -0700 2006

前回のエントリPHPで書かれたwebサービスを高速化するでは高速化のレベルのうち、最初の2段階「ハードウェアによる高速化」「ソフトウェアによる高速化」について書きました。
今回は第2弾として「プログラムの工夫による高速化」について書きたいと思います。

- DBへのアクセスは自分で抽象化する

DBへのアクセスを高速化するためには、チューニングを行ったり複数台構成にするわけですが、
広く使われているPear::DBとかadodbは複数台構成のDBに接続することを考慮されていません。
Pear::DBやadodbはバックエンドに使って、ラッパークラスを作るようにしましょう。

- 更新系クエリと読み出し系クエリのユーザを分ける

これは高速化とは関係ないんですが、ぜひ実行してもらいたいので書きました。
複数台構成のサーバにアクセスするときは更新系クエリはマスターに発行して、
読み出し系クエリはスレーブに発行するので別々のコネクションを使います。

この時にマスターに接続するユーザとスレーブに繋げるユーザを別にして、
マスターへのユーザは更新権限があって、スレーブへのユーザは更新権限が*ない*ようにしましょう。

ちょっとした工夫ですが、これだけでセキュリティレベルがぐんと上がります。

- クエリキャッシュ

ここでいうクエリキャッシュはDBレベルではなくアプリケーションレベルでのキャッシュです。
DBのクエリキャッシュはテーブルが更新されるとキャッシュがクリアされてしまい、
頻繁に更新されるテーブルに対しては有効に機能しません。

世の中のデータには即時性の必要ないデータがいっぱいあって、
即時性の必要ない遅延が許されるデータに対しては、
DBからクエリした結果をそのままキャッシュします。

次回以降はDBに直接アクセスせずにキャッシュしてデータを使用します。
これやるだけでDBへの負荷が全然違います。

僕が開発しているフォト蔵ではmemcachedを使ってクエリキャッシュしてます。
memcachedはメモリ上にデータを置くので高速にアクセスすることができます。

- プロファイルツールを使用する

プログラムの処理の8割は2割のコードで動いているとよく言われますが、
処理のボトルネックになっているところは大体決まってます。

どこが処理が遅いのかを調べるのにプログラムを眺めるのは効率が悪いので、
こういう場合はプロファイルしましょう。

xdebugというPHPの拡張を使うとプロファイル情報を吐き出してくれます。
それを WinCacheGrind のようなツールを使うとどの処理に時間がかかってるのか簡単に調べることができます。



だいぶ長くなってきたので今日はこの辺で。
他にもいろいろ工夫している部分はありますが、また今度気が向いたときにでも書きます。