やってみたこと
php でキャッシングをするにあたって、いろんな方式でのパフォーマンスをチェックしてみました。
エントリー
やってみたのは、次の4種類。
-
apc
php 内部のキャッシュ。再起動すると消えるし、複数のサーバーで共有もできないけど早い。 -
memcached
KVS といえば。今回はローカルサーバー上の memcached サーバーに接続しています。
接続後の読み書き部分のみを計測しています。 -
file
普通のファイル。/tmp/kvs/ というフォルダと、/dev/shm/kvs/ に、キー名称でファイルを作ってみました。
物理ディレクトリと、共有メモリのディレクトリです。
一回の読み込み(又は書き込み)で、ファイルのオープン、読み込み(又は書き込み)、クローズまでを行いました。 -
Oralce
あて馬です。
ただでさえ遅いデータベース。さらにこれ以外が全部ローカルサーバーなのに、これだけリモートという時点でさらに不利。
値は、VARCHAR2 の列に格納しています。read は、SELECT 文で。write は、MERGE で行いました。
結果( 本番サーバー )
本番サーバーで、それぞれ 10,000 回ループして時間を計測してみました。
10,000回実行時の時間を取得しているので、実際の時間は下記の 10,000分の1 です。
方法 | write(1byte) | read(1byte) | write(4K) | read(4K) |
---|---|---|---|---|
apc | 21 ms | 6 ms | 49 ms | 8 ms |
memcached | 266 ms | 416 ms | 377 ms | 412 ms |
file(/dev/shm/kvs/) | 93 ms | 83 ms | 92 ms | 83 ms |
file(/tmp/kvs/) | 197 ms | 88 ms | 197 ms | 87 ms |
Oralce | 5,040 ms | 1,927 ms | 7,028 ms | 3,038 ms |
まとめ
結果ですが、やはり apc は早い。ダントツですね。
memcached が思ったより遅い。
ネットの他の計測では、apc の 2 倍ぐらいが多かったのに。環境依存?
file アクセスは、物理ディレクトリと、メモリでけっこう違うと思っていたらあんまり変わらなかったのは意外。
特に、読み込みはキャッシュが効くのか誤差の範囲内。
データベースは遅いと思ってたけど、ここまで差があるとは。
それでも 1 回のアクセスに 1ms もかかってないんですから、早いっちゃ早いですね。
あと、1byte でも、4K バイトでも結果があんまり変わらないのも面白いですね。
追加結果( 試験サーバー )
本番サーバーだとキャッシュとかの関係なのか、ちょっと直感と反する結果になっていたので、試験用の VM 上のサーバーでも同じものを動かしてみました。
こちらは、CPU, HDD, Memory どれも本番サーバーよりしょぼいです。
方法 | write(1byte) | read(1byte) | write(4K) | read(4K) |
---|---|---|---|---|
apc | 9 ms | 5 ms | 107 ms | 7 ms |
memcached | 1,059 ms | 1,694 ms | 1,435 ms | 1,820 ms |
file(/tmp/kvs/) | 3,816 ms | 293 ms | 4,608 ms | 307 ms |
file(/dev/shm/kvs/) | 326 ms | 247 ms | 401 ms | 272 ms |
Oralce | 9,399 ms | 6,243 ms | 12,242 ms | 9,485 ms |
追加結果まとめ
試験サーバーの方が、どちらかというと直感にあってる感じになりました。
最近のサーバーの write キャッシュとかってすごいんだなぁと改めて実感。
ただ、memcached はやっぱり、そんなに早くなくて、apc は早い。
当たり前ですが、サーバー環境によって結果は変わるもんですね。