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