遅いのはSQLパーサー?
前述したYCSBを使ってCassandraとMyCassandraのベンチマークを取っているところ。
まだ途中なのでちゃんとした結果は公表出来ないのですが、とりあえず1ノードで1KBのレコードを100万件ロードして、ベンチをとったところ、基本的に予想通りな結果になってます。
具体的に言うと、
- 書き込み性能はCassandraの方が6.2倍速い
- 読み込み性能はMyCassandraの方が6.3倍速い
というようにちょうど性能が逆転した形になっています。(CassandraのMemTableサイズは64MB)
MyCassandraの方は読み込み性能が優れているわけですが、ストレージにMySQLを使っていることからレンジクエリについてもCassandraよりも最適化できそうな気がします。(今後実装してベンチマークEで測定してみる予定)
ただ本ベンチマークの実行とは関係ないのですが、
MyCassandraのデータロードが数十倍遅いという問題が...。
更新では問題ありません。あくまで新規データの追加(INSERT)の問題があるようです。
Cassandra/InnoDBの書き込み手順は以下のようになってます。
- Cassandra
- CommiLog(HDD)=>MemTable(Memory)=>SSTable(HDD)
- MemTable=>SSTableへの書き出しは非同期
- InnoDB
- log_buffer(HDD)=>buffer_pool(Memory)=>HDD
- innodb_flush_log_at_trx_commitが2ならbuffer_poolからHDDへの書き出しは非同期(0,1は同期)
と、見た目は両方とも同じ構造になっていることが分かります。
なのに、性能がこんなに遅いのはどこに問題があるのでしょう。
考えられるのはSQLのパース処理とコミット処理が遅いこと。またはMySQLの非同期の実装方法が良くないのではないかと。1秒周期でシステムコール`fdatesync()`を実行するんだとか。