2009-10-02 (金)
■ Memcached と PStore のベンチマーク比較
tDiary のプラグインを作っていると、ローカルにキャッシュを保存することがよくある。 flickr プラグインが取得した XML の写真情報だったり、プロフィールプラグインが取得したプロフィールデータだったり。 今は、 PStore を使って保存しているけど、 Memcached を使ったらどうなるかと思って比較してみた。
比較対象
- 1ファイルに全てのデータを保存する PStore (ファイル数 = 1) → PStoreAdapter
- 1ファイルに1データを保存する PStore (ファイル数 = データ数) → PStoreAdapter2
- Memcached → MemcacheAdapter
ベンチマーク環境
Rubyで書いた。gistにて公開。 データ数を10, 100, 1000と増やし、それぞれの書き込み時間と読み込み時間を計測した。
- Intel Core 2 Duo 2.2 GHz, 4GB memory
- Mac OS X 10.6.1
ベンチマーク結果
「full」ボタンを押すと全画面表示される。 上からデータ数10, 100, 1000での時間。ループ回数は10000回。
PStore and Memcached benchmark
View more documents from Kohei MATSUOKA.
分かったこと
- PStoreで1ファイルにデータを詰め込むとスケールしない。
- PStoreで1ファイル1データとするとスケールする。
- PStoreとMemcachedの時間は同じくらい。
- PStoreは、おそらくディスクのキャッシュが効いているから。ディスクIOが発生すると遅くなるのでは。
感想
tDiary のキャッシュを memcached に載せると速くなるかもと期待したけど、そう甘くはないかも。
■ 追記
キャッシュにputするデータが小さいという指摘をいただいた。 確かに数バイトでは少なかったかも…と思い、 tDiary キャッシュサイズを参考にして、 8KB のデータを put するようにした。
データサイズ8KBでのベンチマーク結果
データ数 = 10
| method | user | system | total |
| PStoreAdapter#put | 9.72 | 1.20 | 10.92 |
| PStoreAdapter#get | 2.65 | 1.27 | 4.02 |
| PStoreAdapter2#put | 1.92 | 0.39 | 2.31 |
| PStoreAdapter2#get | 0.52 | 0.18 | 0.70 |
| MemCacheAdapter#put | 2.05 | 0.29 | 2.34 |
| MemCacheAdapter#gut | 1.24 | 0.25 | 1.49 |
データ数 = 100
| method | user | system | total |
| PStoreAdapter#put | 113.3 | 106.2 | 219.5 |
| PStoreAdapter#get | 20.8 | 10.2 | 31.0 |
| PStoreAdapter2#put | 1.91 | 0.53 | 2.44 |
| PStoreAdapter2#get | 0.51 | 0.19 | 0.70 |
| MemCacheAdapter#put | 2.04 | 0.44 | 2.48 |
| MemCacheAdapter#gut | 1.21 | 0.33 | 1.54 |
データ数 = 1000
| method | user | system | total |
| PStoreAdapter#put | - | - | - |
| PStoreAdapter#get | - | - | - |
| PStoreAdapter2#put | 1.99 | 0.93 | 2.92 |
| PStoreAdapter2#get | 0.56 | 0.22 | 0.78 |
| MemCacheAdapter#put | 2.07 | 0.29 | 2.36 |
| MemCacheAdapter#gut | 1.14 | 0.24 | 1.38 |
考察
1つのファイルに全キャッシュを格納する PStoreAdapter は、明らかに落ち込みが激しい。 データサイズを8KBにすると処理時間が10倍になった。 さらにデータ数に応じて計算量がO(n)で増加するので、大量のデータを1つの PStore ファイルのは望ましくない。
PStoreAdapter2 と MemCacheAdapter はデータサイズの増大で処理時間は2〜3倍に増加しているけど、データ数に関わらずに計算量は O(1) 。 ツッコミで指摘をいただいているけど、 tDiary くらいの規模のアプリケーションであれば、ファイル数の増加とメモリの消費のどちらを選ぶかで選択してもいいかも。
PStore は、読みこむたびに全部のデータをよみこんでオブジェクトにするので、キー数が増えるとスケールしないです。書きこみ時も同様の理由でスケールしません。<br>Pstore2 の場合、ファイル数が増えると嫌だという場合もあるかとおもいます。<br>memcached の場合、データがメモリにおさまらなくなると、expire されてしまうので、google のクローラーなどで舐められると、本来必要なキャッシュが消えてしまう可能性があるとおもいます。<br><br>現実的には、キー数はどの程度が想定されるのでしょうか。