須藤です。 ありがとうございます。 再現できました。 インデックスオンリースキャンのときに一時的に確保しているメモ リーをできるだけすぐに開放するようにしたので、次のリリースか らは必要なメモリー使用量が減るはずです。 とりあえず、以下を設定してインデックスオンリースキャンを無効 にすると回避できるはずです。 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