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

Back to archive index

磯部 和広 k-iso****@rozet*****
2013年 4月 10日 (水) 13:20:48 JST


いつもお世話になっております。

■結論■

SQL文の先頭に
 flush tables;
を付与し
 sysctl -w vm.overcommit_memory=1
する事でエラーが出なくなりました。

本当にありがとうございました。

また、教えて頂いたように下記を実施しました。

if ( ! egrep '^sysctl -w vm.overcommit_memory' /etc/sysctl.conf >
/dev/null ); then
sudo bash -c "echo -e '\n# for mroonga\nsysctl -w vm.overcommit_memory=1' \
>> /etc/sysctl.conf"
fi

こちらにつきましては、社内のサーバーのセットアップ手順書に含めておきました。

■詳細■

>実データが2.1GB * 120で240GBで、それのインデックスは少なくと
>も2倍以上にはなっているのではないかと思います。

はい。

2.1GBのテキストファイルをmroonga化すると6GBになります。
mroonga内に
 インデックス情報
 テーブル本体(データ)情報
が格納されるので、インデックスが2倍になっていると思われます。

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

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

groonga.logを調査しました。

内部的に、mroongaの再起動が掛かっているようです。

[root @ PMJ01 mysql]# grep -B2 'mroonga 3.02 started.' groonga.log | head
-n 21 | tail -n 11
2013-04-09 13:26:17.486475|C|12844700|mmap failed!!! in
GRN_IO_SEG_REF(0x7ef87d4574a0, 169, 1)
2013-04-09 13:26:17.486480|e|12844700|cursor open failed
2013-04-09 13:26:21.354717|n|c14eb7e0|mroonga 3.02 started.
--
2013-04-09
13:27:20.055359|A|1c1fe700|/usr/libexec/mysqld(_Z12mysql_selectP3THDPPP4ItemP10TABLE_LISTjR4ListIS1_ES2_jP8st_orderSB_S2_SB_yP13select_resultP18st_select_lex_unitP13st_select_lex+0x105)
[0x5b8f35]
2013-04-09 13:27:20.055364|C|1c1fe700|mmap failed!!! in
GRN_IO_SEG_REF(0x7efe0466f470, 53, 1)
2013-04-09 13:27:24.167334|n|8dabc7e0|mroonga 3.02 started.
--
2013-04-09 13:36:03.263132|C|e40c4700|mmap failed!!! in
GRN_IO_SEG_REF(0x7f9f514574a0, 353, 1)
2013-04-09 13:36:03.263137|e|e40c4700|cursor open failed
2013-04-09 13:36:07.306581|n|725827e0|mroonga 3.02 started.
[root @ PMJ01 mysql]#


この再起動が掛かると、エラー状態から回復するようです。

># sysctl -w vm.overcommit_memory=1

実施しましたが、効果はあったものの、完治しませんでした。 

エラーが起きた後に、リカバリーとして
 flush tables;
を実行し、エラーになったSQLを再実行しても再度エラーとなりました。

この為、実行するSQL文の先頭に
 flush tables;
を加えた所、全くエラーが起きなくなりました。




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