unoh.github.com

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

Mon May 22 23:10:30 -0700 2006

尾藤正人です。

アクセス数の多いコンシューマ向けの web サービスは、処理速度がかなり重要になってきます。
応答速度が遅いと使用しているユーザにとってストレスになりますし、
処理に時間がかかればサーバに対する負荷も高くなります(厳密に言うと違う)。

そこでウノウではいろいろな工夫をして処理速度の高速化を行っています。

一口に高速化といってもいろいろな要素がありますが、大きく分けて3つの段階があります。

・ハードウェアによる高速化
・ソフトウェアによる高速化
・プログラムの工夫による高速化

しかし、これら3つは独立ではなく、互いに影響しあっているので完全に分けて考えることはできません。
それぞれがどのような部分に影響を与えているのか、ちゃんと理解してチューニングすることが大事です。

ただし、高速化するときに忘れていけないのが、高可用性です。
いくら高速に動作しても安定して動作しないのであれば、導入するべきではありません。

例えばCPUをオーバークロックで高速に動作させても1日に1回落ちるようではwebサービスとして成り立ちませんから、こういう高速化は行いません。

・ハードウェアによる高速化

お金をかければ速くなります。(^^;
ただ闇雲に高価なマシンを買えばいいというものではありません。

あまりお金のないベンチャー企業は、そこそこのマシンを使ってソフトウェアの方で頑張ることになります。

・ソフトウェアによる高速化

ここでいうソフトウェアの高速化はプログラムを書かない段階で、既存ソフトウェアの導入、設定、アップグレード等によって高速化を行います。

- ファイルシステムに ext3 を"使わない"

ext3 はファイル数が増えると顕著に処理速度が遅くなります。
ReiserFS, JFS, XFS等はファイル数が増えても高速に動作します。

- DBのチューニング

他に詳しい解説があるので、ここでは割愛。
書くと墓穴を掘りそうなので。

- mod_deflateを使う

htmlはテキストデータなので圧縮するとかなり小さくなります。
使用する帯域が減るということはレスポンスが速くなるということです。
サーバ側で圧縮処理が必要になりますが、体感速度が全然違います。
ぜひ、導入しましょう。

- .htaccessを使わない

.htaccessを使うとアクセスの度に読み込みが行われるので遅くなります。
.htaccessに書く内容はすべてhttpd.confに書くようにしましょう。

- apacheはpreforkで動作させる

これは高速化ではなく、むしろ鈍速化。
以前フォト蔵でworkerで動作させていたのですが、不安定だったのでpreforkに戻しました。
少しぐらい速くなってもやはり安定性が重要です。

- eAccelerator(PHP拡張)を使う

eAcceleratorを使うとコンパイル済みスクリプトをキャッシュしてくれるようになるので、毎回バイトコンパイルする必要がなくなります。
スクリプトが更新されても自動的にキャッシュファイルも更新してくれるので動作には全く問題ありません。

- Zend Optimizer(PHP拡張)を使う

Zend Optimizerを使うとPHPを高速に実行してくれます。

Zend OptimizerとeAcceleratorは共存可能です。
フォト蔵ではずっとZend OptimizerとeAcceleratorを使用していますが、問題が起こったことは1回もありません。

Yahooのapacheもpreforkで動作しているようですし。


いろいろ書いてたら長くなってので今日はこの辺で。
プログラム側でもいろいろ工夫をしていますが、それはまた後日書きます。