memcachedのストレージにSSDを使うアイディア

memcached Night in Tokyo #1によれば、miximemcachedサーバーを135台使っているらしい。多い!
話に依れば一番最初に足りなくなるのはメモリの容量(3GBほど割り当てられている)で、ネットワークやCPUはボトルネックになっていないらしい。


ではメモリの代わりにHDDを使うのはどうか。HDDのランダムアクセス時の遅延がかなり大きいので、影響が出るほど遅くなりそう。

そこでSSDを使うのはどうか。ランダムリードで700Mbpsくらい出るらしいので、スループットに関してはCPUの方が先に限界に来ると思う。遅延はどれくらいか良く分からないが、アプリケーション側でget_multiを使っていれば隠蔽できないか。
バイト単価はDRAMよりはずっと安い。


実装としては以下:

  • 32GBくらいのSSD
  • 2GBくらいのメモリ(多ければ多いほどキャッシュに載りやすいので、平均の遅延を小さくできる)
  • ボトルネックにならない程度のCPU
  • ストレージエンジンがモジューラブルになっている新しいmemcachedで、Tokyo Cabinetを使う(memcachedのストレージ層をmodularにしてみた
  • Tokyo Cabinetをチューニングする
  • とにかくランダムアクセスが速いファイルシステムを選ぶ(ext2?)
  • カーネルのIOスケジューラをチューニングする
  • memcachedはマルチスレッド化する(SSDはランダムアクセスもシーケンシャルアクセスも速度が同じなので、並列度を上げてもオーバーヘッドが無い。ユーザーランド→カーネルバッファの遅延を隠蔽できる)

mixiでは100bytes周辺の非常に小さいデータが多いらしいので、データのサイズが小さい場合は固定長データベースを使い、大きい場合はハッシュデータベースを使うようにするといいかもしれない。SSDを使えばボトルネックは容量ではなくなるだろうから、多少空間効率が悪くなっても問題ない。(キーが自然数でないといけないという制約がクリアできれば)

これでどのくらいの性能が出るだろう。アプリケーション側の変更は不要。

これでもボトルネックが容量にあるとすれば、サーバーは 12台 まで減らせる…それはムリだとしても、サーバーが減れば電気代も減るし、管理も楽になる。SSDの空き容量をルートファイルシステムに使えばHDDを無くせるから、故障率も下がってイケてるんじゃないか。