kumofsに10MBのvalueを入れるとどうなるか実験してみた

kumofsは、本来小さいサイズのvalueを大量に入れることを想定した分散KVSで、高解像度の画像など、サイズの大きいvalueを入れることは想定されていない。と言うかテストされていない。
でも、実は入れてみたら案外うまく動くんじゃないか?というわけで試してみた。

結論

  • データ総量30GB、物理ホスト1台で試した限りでは、実は問題は無さそう
    • 物理ホスト1台というのが不十分なので微妙…
  • ノードを追加したり復旧したりするとき、数時間の間、速度が半分くらいに劣化する
    • データ量1TB、サーバ4台の構成で、2時間くらいかかる推定
  • データの再配置がタイムアウトしてしまう可能性があるが確認できていない。3台以上の構成で追試する必要あり
  • 速度は、サーバ1台につき、Get 6.7 req/sec、Set 3.8 req/sec くらい
    • ほぼ線形にスケールアウトすると仮定すれば、4台投入すれば Get 26.8 req/sec、Set 15.2 req/sec

環境

  • Athlon64 X2 5000+
  • メモリ8GB
  • HDDは4台でRAID-10構成
  • linux-2.6.27.0 x86_64
  • kumofs-0.3.1
  • memstrike-1.0.0
  • libmemcached-0.33

実験内容

  • 1台のホストでkumo-serverを3プロセス動かす
    • クライアント(=ベンチマークツール=memstrike)も同じホストで動かす
  • 10MBのvalueを、1000件入れる
    • memstrike -v 10485760 -t 20 1000 # 20スレッドで10MBのvalueを1000件Set/Get
    • 3つにレプリケーションされるので、書き込まれるデータの総量は10MB×1000件×3=30GB
    • ここで「通常時のSet速度」を測る
    • ここで「通常時のGet速度」を測る
  • kumo-serverを1つ落として、データベースを削除する(=故障した想定)
  • 落としたプロセスを再度立ち上げて、attachする
    • ここで「再配置時間」を測る
  • もう一回落として、もう一回立ち上げ直して、attachする
    • ここで「再配置中のGet速度」を測る

結果

通常時のSet速度
  • 結果そのまま:3.8 req/sec
  • 1台で3プロセス立ち上げて、全プロセスにレプリケーションしているので、物理ホスト1台あたりの書き込み速度は 3.8×3=11.4 req/sec
  • 4台投入すると、11.4 × 3 = 45.6 req/sec
通常時のGet速度
  • 結果そのまま:6.7 req/sec
再配置時間
  • 結果そのまま:
    • データを全件スキャンして移動するべきデータを取り出すのにかかった時間:210秒
    • データの転送にかかった時間:80秒
  • スループットは 1000件 / (210秒 + 80秒)= 3.44件/sec くらい
    • MB/secに直すと 10MB × 1000件 / (210秒 + 80秒) = 34.4MB/sec くらい
  • 1台構成、データ量1TBで、1TB / 34.4 = 8時間 くらい
  • 4台構成、データ量1TBで、2時間 くらい

データの再配置はストリーム全体を圧縮して行っているが、今回使ったデータは全部 'v' で埋められたデータなので、圧縮率がやたら効いている。
実際にはデータの転送にもっと時間がかかるハズ…だが、実際にはHDDの方がボトルネックになっているはずなので、おそらく結果には関係ない。遅延は若干増えるはずだが、ミリ秒レベル。

再配置中のGet速度
  • 結果そのまま:3.4 req/sec
  • 通常時は 6.7 req/sec だったので、半分くらいに落ちている