[groonga-dev,04689] Re: PGroongaの全文検索時にメモリ不足でPostgresが落ちる

Back to archive index
Kouhei Sutou kou****@clear*****
2018年 10月 15日 (月) 14:18:22 JST


須藤です。

ありがとうございます。
再現できました。

インデックスオンリースキャンのときに一時的に確保しているメモ
リーをできるだけすぐに開放するようにしたので、次のリリースか
らは必要なメモリー使用量が減るはずです。

とりあえず、以下を設定してインデックスオンリースキャンを無効
にすると回避できるはずです。

SET enable_indexonlyscan = no;

今回のケースだとビットマップスキャンの方が速いので↑を設定す
ると速度も上がるはずです。本当はインデックスオンリースキャン
の方を速くしたいんですよねぇ。くやしいなぁ。


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

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
データ処理ツールの開発:
  https://www.clear-code.com/blog/2018/7/11.html


In <6a7e2****@yahoo*****>
  "[groonga-dev,04687] Re: PGroongaの全文検索時にメモリ不足でPostgresが落ちる" on Wed, 10 Oct 2018 14:38:29 +0900,
  川上 <hakuh****@yahoo*****> wrote:

> 須藤さま
> 
> 川上です。
> 
> ご連絡遅くなって申し訳ございません。
> 
> 
> 再現用のSQL一式を作成してみました。
> 
> 
> ○前提
> 
> Postgres, PGroongaインストール済み
> 
> OSメモリ1GB、他、基本的には初期設定のまま
> 
> 
> ○手順
> 
> -- データベース作成
> 
> $ psql -U postgres
> 
> postgres=# CREATE DATABASE bulk;
> 
> postgres=# \q
> 
> $ psql -U postgres -d bulk
> 
> bulk=# CREATE EXTENSION pgroonga;
> 
> 
> -- テーブル作成
> bulk=# CREATE TABLE users (
>     id SERIAL,
>     name TEXT NOT NULL,
>     kind INTEGER NOT NULL,
>     created TIMESTAMP,
>     updated TIMESTAMP
> );
> 
> 
> -- データ登録(1000万件)
> bulk=# WITH RECURSIVE serical_table(n) AS
> (
>  SELECT 1
>  UNION ALL
>  SELECT n + 1 FROM serical_table
>  WHERE n < 10000000
> )
> INSERT INTO users (name, kind, created, updated)
>   (SELECT 'kawakami' || random(), ((random() * 1000)::int % 100),
> NOW(), NOW()
>   FROM serical_table)
> ;
> 
> -- PGroongaのINDEX作成
> bulk=# CREATE INDEX pgroonga_name_index ON users USING pgroonga
> (name);
> 
> 
> -- 大量にヒットする検索実施(このSQL実行中に後述のエラーが発生する)
> bulk=# SELECT COUNT(*) FROM users WHERE name &@~ 'ka';
> 
> サーバとの接続が想定外にクローズされました
>         おそらく要求の処理前または処理中にサーバが異常終了
>         したことを意味しています。
> サーバーへの接続が失われました。リセットしています: 失敗。
> 
> 
> 
> ○補足
> 
> 未検証ですが、検証環境のメモリが大きくて再現しない場合は、
> 
> 下記の設定を入れると再現するのかもしれません。
> 
> $ vi /etc/sysctl.conf
> 
> vm.max_map_count = 3906
> 
> $ sysctl -p
> 
> 
> 
> 以上、よろしくお願いいたします。
> 
> 
> On 2018/10/05 17:34, Kouhei Sutou wrote:
>> 須藤です。
>>
>> うーん、では、未知の問題かもしれません。
>>
>> 手元で再現させたいのですが、再現用のSQL一式(CREATE TABLEや
>> CREATE INDEXやINSERTやSELECT)を提供してもらえないでしょうか?
>>
>> In <1a428****@yahoo*****>
>>    "Re: [groonga-dev,04685] Re: PGroongaの全文検索時にメモリ不足で
>>    Postgresが落ちる" on Fri, 5 Oct 2018 17:29:54 +0900,
>>    川上 <hakuh****@yahoo*****> wrote:
>>
>>> 須藤さま
>>>
>>> 川上です。
>>>
>>> ご連絡ありがとうございます!
>>> 2.1.3にダウングレードしてみましたが、結果は変わらずでした。。
>>>
>>> ちなみに、PGroongaのログ(/var/lib/pgsql/10/data/pgroonga.log)
>>> も見てみましたが、何も出力されていないようでした。
>>>
>>> これを回避する設定があるとすれば、Postgres側でしょうか。。
>>>
>>> On 2018/10/05 8:55, Kouhei Sutou wrote:
>>>> 須藤です。
>>>>
>>>> PGroonga 2.1.3を試してみてもらえますか?
>>>> 2.1.4で入れた変更が影響している可能性があるのです。
>>>>
>>>> 以下で2.1.3にダウングレードできるはずです。
>>>>
>>>> % sudo -H yum install postgresql10-pgroonga-2.1.3
>>>>
>>>> In <44217****@yahoo*****>
>>>>     "[groonga-dev,04684] PGroongaの全文検索時にメモリ不足でPostgresが落ち
>>>>     る" on Thu, 4 Oct 2018 19:24:08 +0900,
>>>>     ??? <hakuh****@yahoo*****> wrote:
>>>>
>>>>> はじめて連絡させていただきます、川上と申します。
>>>>>
>>>>>
>>>>> 現在、PGroongaを初めて使って全文検索を実装しているのですが、
>>>>>
>>>>> ヒット件数が多い場合にメモリ不足になり、Postgresが落ちる状態になって困っ
>>>>> ております。
>>>>>
>>>>>
>>>>> ◯環境
>>>>>
>>>>> ・DBサーバーとWebサーバーは別サーバー(CentOS7)
>>>>>
>>>>> ・Postgres10.5
>>>>>
>>>>> ・PGronnga2.1.4
>>>>>
>>>>> ・OSメモリ:1GB(検証中なので低スペック)
>>>>>
>>>>> ・検索対象のテーブル件数:730万件程度
>>>>>
>>>>> ・検索対象のテーブル容量:4.4GB程度
>>>>>
>>>>> ・INDEX容量:1GB程度
>>>>>
>>>>> ・下記設定は入れております
>>>>>
>>>>>   vm.overcommit_memory = 1
>>>>>
>>>>>
>>>>> ◯現象
>>>>>
>>>>> 400万件ほどヒットする検索を行うと、Postgresが異常終了する
>>>>>
>>>>>  SQL例)select count(*) from table where column &@~ '100';
>>>>>
>>>>>
>>>>> ◯Postgresのログ抜粋
>>>>>
>>>>>   DEBUG:  mmap(291504128) with MAP_HUGETLB failed, huge pages
>>>>> disabled:
>>>>> メモリを確保できません
>>>>>   LOG:  データベースシステムは中断されました: 2018-09-14 19:37:21
>>>>> JST
>>>>> まで動作していたことは確認できます
>>>>>   FATAL:  データベースシステムはリカバリモードです
>>>>>   LOG:  データベースシステムは正しくシャットダウンされていません;
>>>>> 自動リカバリを実行中
>>>>>
>>>>>
>>>>> ◯質問事項
>>>>>
>>>>> この状態でメモリ不足になることは理解できます。
>>>>>
>>>>> 困っているは、メモリ不足に陥った場合にPostgresが落ちるという現象です。
>>>>>
>>>>> 例えば、検索中に設定した上限のメモリ数を使っても検索出来ない場合は、検
>>>>> 索処理を中止して、
>>>>>
>>>>> エラーを返すようにする(Postgresが異常終了しない)といった設定や方法は
>>>>> ないのでしょうか?
>>>>>
>>>>>
>>>>> ◯補足1
>>>>>
>>>>> Groonga用のサーバーを立てればPostgresが落ちることはないのかもしれませ
>>>>> んが、
>>>>>
>>>>> 都合上、難しい状態にあります。
>>>>>
>>>>>
>>>>> ◯補足2
>>>>>
>>>>> 検索結果が数万件程度であれば、数ミリ秒で検索結果が返ることは確認してお
>>>>> ります。
>>>>>
>>>>> ただし、そのような検索条件であっても、JMeterを用いて同時に検索処理を走
>>>>> らせたら
>>>>>
>>>>> やはりメモリ不足に陥るため、メモリ不足になってもPostgresが落ちないよう
>>>>>>>>>>
>>>>> 根本的な対策を入れておきたいと考えております。
>>>>>
>>>>>
>>>>>
>>>>> 以上、何卒よろしくお願いいたします。
>>>>>
>>>>> _______________________________________________
>>>>> groonga-dev mailing list
>>>>> groon****@lists*****
>>>>> https://lists.osdn.me/mailman/listinfo/groonga-dev
>>>> _______________________________________________
>>>> groonga-dev mailing list
>>>> groon****@lists*****
>>>> https://lists.osdn.me/mailman/listinfo/groonga-dev
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> https://lists.osdn.me/mailman/listinfo/groonga-dev
> 
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> https://lists.osdn.me/mailman/listinfo/groonga-dev


More information about the groonga-dev mailing list
Back to archive index