須藤さま 川上です。 ご連絡遅くなって申し訳ございません。 再現用の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