[groonga-dev,01294] Re: mroongaの検索時エラーについて

Back to archive index

Kouhei Sutou kou****@clear*****
2013年 4月 9日 (火) 22:57:02 JST


須藤です。

In <5163F****@rozet*****>
  "[groonga-dev,01293] mroongaの検索時エラーについて" on Tue, 09 Apr 2013 20:47:48 +0900,
  磯部 和広 <k-iso****@rozet*****> wrote:

> ■背景■
> 
> 現在、約2.1GBのテキストがそれぞれ格納されたファイル120個を原料に、
> 120個のmroongaのテーブルを作成して使用しております。

> ■首題の現象■
> 
> 通常は問題無く検索できるのですが
>  バッチ処理にして、複数の検索語を次々検索する
> という事を行いますと、時々エラーが出ます。
> 
> 概ね、3回検索するとエラーが1回出る感じです。
> 
> 120行(テーブル)のSQL文を1回で、ではなく、60行を2回にもしてみたのですが
> 起きる頻度は変わりませんでした。
> 
> エラーが出ると、SQLを再実行してもエラーとなるのですが
> 別のSQLを流すと成功します。
> 
> いつもだいたい同じテーブル(110)あたりでエラーとなるのですが
> エラーとなったテーブル単体で検索するとエラーとならず、
> バッチ処理内での聞く順番を変えるとエラーなく検索出来たりしますので
>  ・検索語やテーブルには問題が無い
>  ・mroonga側の内部処理に問題がある
> のだと思います。
> 
> どうも
>  短時間で複数のテーブルに検索を発行すると、
>  mroonga側で何らかのメモリ処理が追い付かずエラー
> となっているような動きです。

groongaはテーブルやカラムに対応したファイルをそれぞれ1つ作り、
そこにデータを格納します。ただ、ファイルサイズが1GBを超える
と別のファイルを作り、そちらにもデータを保存します。別ファイ
ルになったデータは必要になったときにmmapして利用します。つま
り、必要になるまではメモリ上にロードされないということです。

さて、今回のケースではたくさんのテーブルに対してたくさんの検
索語で検索しているということなので、格納されているデータがま
んべんなくヒットし、より多くのデータをmmapしている状況だと考
えられます。

実データが2.1GB * 120で240GBで、それのインデックスは少なくと
も2倍以上にはなっているのではないかと思います。実メモリが
32GBということなので、多くのデータがロードされる場合はメモリ
不足になります。

groongaはデータベースを閉じるまでは一度mmapした領域をunmapし
ません。mroongaで言えばFLUSH TABLESを実行するとgroongaのデー
タベースを一度閉じています。

> このため、現在は
>  エラーが起きたらsleepしてから「SQLを変えて」再実行
> という処理で逃げています。

これで回避できている理由がわからないのですが、明示的にFLUSH
TABLESを実行しても回避できるのではないかと思います。
(MySQLは自動的にFLUSH TABLES相当のことをするのでしょう
か。。。)


あと、もしかしたら、以下を実行するとそもそもこの現象が起こら
なくなるかもしれません。

  # sysctl -w vm.overcommit_memory=1

これを実行すると実メモリ以上の領域をmmapしようとしてもエラー
にならなくなります。mmapしても使われなければエラーになりませ
ん。(使われたらエラーになります。)

なお、Redisも同じ設定を推奨しています。

もし、これでうまく動くようになったら、/etc/sysctl.conf
(か/etc/sysctl.d/groonga.confとかいうファイルを作ってそこ)
に以下を記述しておくと再起動後も設定が有効になります。

  vm.overcommit_memory = 1

> メモリの使用状況は下記です。
> 
> [root @ PMJ01 mysql]# free -m
> total used free shared buffers cached
> Mem: 32020 31181 839 0 15 29788
> -/+ buffers/cache: 1378 30642
> Swap: 16079 0 16079
> [root @ PMJ01 mysql]#

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

groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コミットへのコメントサービスはじめました:
  http://www.clear-code.com/services/commit-comment.html




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