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