TokyoCabinet 64GBの壁 | CyberX:エンジニアブログ

TokyoCabinet 64GBの壁

こんにちは、

CyberX エンジニア今井です。



先週から始めたエンジニアブログですが、

今回は自分が担当です。


とはいえ、ブログに何を書くべきか大分悩みました。


悩んだ結果、最近アプリの運用中に起こった

TokyoCabinetの容量が64GBになると、

データが書き込めない件について取り上げたいと思います。



そもそも、64GBもデータを入れることがおかしいって言われると

あれですが…



最近、KVSを使うことも、大分主流になり、

弊社でもTokyoTyrant + TokyoCabinetを利用しております。



自分が知る限りでは、今までトラブルなく運用していたようですが、

先日、TokyoCabinetにデータが書き込めない事象が発生。



原因としては64bit環境で容量64GB以上のTokyoCabinetのデータファイルを扱うには、
HDBTLARGEオプションを指定する必要があるようです。



ちなみに、試しにHDBTLARGEオプションを指定して、64GBの壁を突破できるか検証してみました。



case.1 下記の例のように起動時のオプションに#opts=lを指定し、データベースファイルを作成

例) tt.tch#bnum=10000000#xmsiz=512m#opts=l

検証結果)
見事に64GB以上のデータを格納でき、put,getも正常動作しました。
しかし、メモリサイズが小さいので、64GBに近づくにつれ、
putの処理速度の低下。


case.2 作成済みのデータベースファイルで途中から起動オプション#opts=lを指定→optimizeを実行
→ttserverを再起動


検証結果)
64GBは越えたが、putとgetが正常に動作しない
optimize実行時に-tlオプションをつける必要があるようで、
以下のコマンドで最適化をしたら、読み書きも可能になりました。

tchmgr optimize -nl -tl tt.tch

検証してみて、TokyoCabinetに64GB以上のデータを
格納するよりも、分散するほうがスループットが向上すると
思いました。
(ペンチマークをとったわけではないですが…)

最後に、64GBの壁の対策などをまとめておきます。


■対策

1. TokyoCabinetを分散する。

 ディスクI/Oを減らす効果もあるので最も理想的かと。


2. 64GB以上の容量を使用したい場合は、起動オプションに#opts=lをつける

  (64bit環境ではつける必要があります)



■一時的な対策

1. TokyoCabinetの最適化をして、容量を減らす。

※この際、不要なデータを削除してから行うと最適



ちなみに、今回はTokyoTyrant + TokyoCabinetでしたが、TokyoCabinetを使用しているKVS
は他にもあるので、注意が必要です。