[groonga-dev,04098] Re: Mroongaストレージモードでメモリリークの可能性

Back to archive index

Kouhei Sutou kou****@clear*****
2016年 7月 27日 (水) 23:37:53 JST


須藤です。

In <EDEF9****@gmail*****>
  "[groonga-dev,04097] Re: Mroongaストレージモードでメモリリークの可能性" on Wed, 27 Jul 2016 10:08:22 +0900,
  murata satoshi <murat****@gmail*****> wrote:

>> ただ、alloc_countとVmRSS(kB)を見ると上下のブレはあるものの安
>> 定しているように見えます。なので、GCが動くタイミングによるブ
>> レの範囲な気がします。
> 
> 確かに、実運用の環境だと1時間に100MB〜使用メモリが増加していくのに比べて
> このテストだと多くても数MB程度……というのも気になっています。
> SQLのパターンの違いなのか別の要因なのか。。。

あ、そうなんですか。
もしかすると再現できていないのかもしれませんね。。。

実環境だと再現するようなので、実環境をmruby無効で使ってみて
変化があるかを確認するのは現実的な気がしました。

>>  10 <= c AND c < 100
>> のような上限と下限を指定した範囲条件はありますか?
> 
> 
> 範囲条件の指定はありますが、betweenに書き換え可能です。
> これはmroonga_command(‘select…')の場合もbetweenに直す必要がありますか?

はい、多くの場合は直したほうが性能があがることが多いので直し
たほうがよいです。ただ、データによってはそれほど変わらないの
で、一度手動で現状のクエリーと書き換えたクエリーの速度を比較
してみてください。

なお、mroonga_command('select ...')でのbetween()は

  between(c, 10, "include", 100, "exclude")

のように書きます。SQLと構文が違うので注意してください。

参考: http://groonga.org/ja/docs/reference/functions/between.html


ユーザー視点からするとどちらでも速く動いて欲しいと思うと思い
ます。なので、そこらへんの最適化をmrubyで実装していたのでし
た。

なお、どのようなデータだとそれほど変わらないのかというと、条
件に指定した範囲の中にほとんどのレコードが含まれる場合です。

mrubyが無効な場合は「10 <= c」と「c < 100」をそれぞれ実行し
てANDをとります。なので、cが10よりレコードまたはcが100以上の
レコードがたくさんあるとムダなレコードを処理してしまい速度が
落ちがちです。図にするとこんな感じです。

  https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2014/?page=42

一方、betweenを使うまたはmrubyで最適化すると下限と上限を指定
した範囲検索をするので一回の検索で「10 <= c AND c < 100」を
処理します。このため、ムダなレコードを処理しなくなるので速く
なります。図にするとこんな感じです。

  https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2014/?page=44


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
OSS開発支援サービス:
  http://www.clear-code.com/blog/2016/6/27.html




groonga-dev メーリングリストの案内
Back to archive index