Kouhei Sutou
kou****@clear*****
2014年 8月 11日 (月) 21:12:07 JST
須藤です。
Groongaのmasterにmrubyを組み込めるようにしたので、興味のある
人は動作チェックをしてもらえないでしょうか?Groonga、Mroonga、
Rroonga他、どれを使っている人のチェックでも助かります。
以下、背景とチェックして欲しいことを説明します。
まず、背景です。
Groongaは高速に動作するためにC言語で書かれています。
実際に高速に動作するんですが、スクリプト言語に比べると開発す
るときは大変です。
何回も呼ばれる処理や重い処理は大変でもC言語で書かないと速度
がでないのでがんばって書くんですが、それほど呼ばれない処理は
全体としてみると実行時間が短い処理など速度への影響が小さいと
ころはスクリプト言語で書いて開発速度をあげたいところです。
で、そういう処理にクエリーオプティマイザーという処理がありま
す。実際にクエリーを実行する前にクエリーを最適化する処理です。
このクエリーではこのインデックスを使うとか、順序を入れ替えて
処理が軽くなるようにするとか、ということをします。
この処理は実際のクエリー実行に比べると軽い処理です。もし、う
まくクエリーを最適化できると桁違い(10倍とか100倍とか)に速く
なることもあります。そうなったら、クリーオプティマイザーの処
理時間が数msec遅くなっても十分に割に合います。
例えば、現在のGroongaのクエリーオプティマイザーは
100 < price && price < 1000
というクエリーが苦手です。このクエリーを次のように実行します。
1. priceが100より大きいレコードを全部取得
2. priceが1000より小さいレコードを全部取得
3. 1.と2.の両方にマッチするレコードを残す
もし、100より小さいレコードと1000より大きいレコードが1000万件
あって、100から1000の間のレコードが100件しかなかったらとても
オーバーヘッドが大きいです。図にするとこんなケースです。
|------------+-----------+-----------------|
0 100 1000 10000
↑たくさん ↑少し ↑たくさん
このとき、「たくさん」のレコードも取得するので遅いです。
この処理を次のようにすると高速になります。
1. priceが100から1000の間のレコードだけを取得
Groongaには↑の機能があるのでクエリーオプティマイザーが賢け
ればこんな実行処理にすることができます。
ちなみに、今は
between(price, 100, "exclude", 1000, "exclude")
と書くと高速な処理になります。クエリーオプティマイザーじゃな
くてユーザーががんばらないといけないという状況ですね。
そんなクエリーオプティマイザーは、クエリーを解析して最適化の
パターンを見つける、ということをするので、転置索引を実装する
みたいな難しさはないのですが、面倒な処理です。それをC言語で
書くのは大変です。そこで、mrubyで書きたいわけなんですよ!
mrubyで書けると、さくっとクエリーオプティマイザーを書き換えて、
どのくらい効果があるかを計測、みたいなことができるようになり
ます。
で、ついに、今のGroongaのmasterでは、現在C言語で書かれている
クエリーオプティマイザーと同じ処理をmrubyで置き換えられるよ
うになりました。
ここまでが背景です。長かったですね。
で、チェックして欲しいことです。
どれも、mrubyを組み込んでいないGroonga(従来のGroonga)と組み
込んでいるGroongaの「違い」がポイントです。組み込み版だけの
結果だけだとなんとも言えないので、どちらもチェックして欲しい
です。
* メモリー使用量の変化
* 絶対的なメモリー使用量の増加分
* 備考: 増加分がどのくらいかを知って、軽微かどうかを確
認したいです。
* 参考: mrubyを組み込んでいる分だけいままでより増えるはずです。
* メモリー使用量が増加していかないか
* 備考: メモリリークしていないかの確認
* 実行時間の変化
* 最大QPS(queries per sec。秒間クエリー数)
* Cで書いたコードよりmrubyで書いたコードの方が処理量が多
くなるので実行時間は増えます。
* 今はどちらも同じ処理をしているのでmruby版が早くなる
ことはないはずです。
* 減少分がどのくらいかを知って、軽微かどうかを確認した
いです。
実行する内容は、今、自分が使っている内容と同じか似せてくれる
と嬉しいです。いろんなパターンでの結果を知りたいからです。
なお、masterのGroongaのビルド方法は次の通りです。
(適宜configureには--prefixを指定してください。)
git clone --recursive https://github.com/groonga/groonga.git
cd groonga
./autogen.sh
./configure --enable-mruby --with-ruby
make -j > /dev/null
sudo make install
Groongaの高速化につながるため、協力よろしくお願いします!
--
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>
Groongaベースの全文検索システムを総合サポート:
http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
http://www.clear-code.com/services/code-reader/