遅いのは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()`を実行するんだとか。