[pgsql-jp: 42027] Re: PostgreSQL11にてPROCEDUREを使用したPL/pgSQLでメモリ増加

TAKATSUKA Haruka harukat @ postgresql.jp
2019年 9月 13日 (金) 01:11:29 UTC


永吉さん、
高塚と申します。

Linux で調べると、ループが続く限りプロセスの使用メモリが増え続ける
というわけでも無いですね。
ただ、一時的にプロセスの使用メモリ量が大きく膨らむ動作は観測できました。
あまり詳しく調べていないのですが、ひとまず報告しておきます。

db1=# CREATE TABLE t1 (id int, v text);
db1=# INSERT INTO t1 SELECT g, md5(g::text) FROM generate_series(1, 100000) g;
db1=# CREATE PROCEDURE pc_sub() LANGUAGE plpgsql AS $$ DECLARE rec RECORD;
      BEGIN SELECT * INTO rec FROM t1; NULL; END; $$;
db1=# CREATE PROCEDURE pc_main(c int) LANGUAGE plpgsql AS $$ DECLARE n int;
      BEGIN FOR n IN 1 .. c LOOP CALL pc_sub(); END LOOP; END $$;
db1=# CALL pc_main(1000000);

[postgres ~]$ ps x | grep CALL | grep -v grep
16867 ?        Ds     1:22 postgres: postgres db1 [local] CALL
[postgres ~]$ p=16867 ; echo -n "PID:$p mem use(kB):" ; \
  cat /proc/$p/smaps | grep Private | sed -e 's/^.*://' -e 's/kB//' | \
  awk '{ sum += $1 } ; END { print sum }'
PID:16867 mem use(kB):220980
[postgres ~]$ p=16867 ; echo -n "PID:$p mem use(kB):" ; \
  cat /proc/$p/smaps | grep Private | sed -e 's/^.*://' -e 's/kB//' | \
  awk '{ sum += $1 } ; END { print sum }'
PID:16867 mem use(kB):339668

(以下結果だけ)
PID:16867 mem use(kB):453888
PID:16867 mem use(kB):638172
PID:16867 mem use(kB):880916
PID:16867 mem use(kB):1036772
PID:16867 mem use(kB):1289756
PID:16867 mem use(kB):1457176
PID:16867 mem use(kB):1647164
PID:16867 mem use(kB):2012496
PID:16867 mem use(kB):2639904
PID:16867 mem use(kB):3170596
PID:16867 mem use(kB):3504604
PID:16867 mem use(kB):3497824
PID:16867 mem use(kB):3517192
PID:16867 mem use(kB):3491892
PID:16867 mem use(kB):3509284
PID:16867 mem use(kB):1141636
PID:16867 mem use(kB):908084
PID:16867 mem use(kB):852668
PID:16867 mem use(kB):73376
PID:16867 mem use(kB):73372
PID:16867 mem use(kB):73376
PID:16867 mem use(kB):73372
PID:16867 mem use(kB):73372


On Wed, 11 Sep 2019 19:10:29 +0900 (JST)
"misakana @ yahoo.co.jp" <misakana @ yahoo.co.jp> wrote:

> 初めて投稿いたします。永吉と申します。
> 
> PostgreSQL11でPROCEDUREを使用したPL/pgSQLにてツールを作成しています。
> (Ver.11からのトランザクション機能を活用するためPROCEDUREを使用)
> 
> テーブル項目の更新を確認するPROCEDUREを作成し、親となるPROCEDUREから
> そのPROCEDUREを繰り返し呼び出す(CALLする)構造にしています。この時、
> Windows側で該当するプロセスのメモリ使用量が増加し、総メモリ使用量が
> 100%近くなった段階で、PROCEDUREが「ERROR: out of memory」となり停止
> してしまいます。
> 
> <環境>
>   -Windows 7 Professional Service Pack1 64Bit
>   -実装メモリ 4GB
>   -PostgreSQL 11.5, compiled by Visual C++ build 1914, 64-bit
> 
> <ソース> <= 実際は複雑ですが下記だけで再現します。
> 
> CREATE OR REPLACE PROCEDURE pc_dps11e(re_count integer)
> LANGUAGE 'plpgsql' AS $BODY$
> DECLARE
>     n integer;  -- ループ変数
> BEGIN
>     RAISE NOTICE '## ひたすらプロシジャを呼び出す ##';
>     RAISE NOTICE 'START : %', TO_CHAR(clock_timestamp(), 'YYYY/MM/DD HH24:MI:SS');
> 
>     FOR n IN 1..re_count LOOP
>         CALL p_dps11z();
>     END LOOP;
>     RAISE NOTICE 'END  : %', TO_CHAR(clock_timestamp(), 'YYYY/MM/DD HH24:MI:SS');
>     PERFORM pg_sleep(10.0);
> END; $BODY$;
> 
> CREATE OR REPLACE PROCEDURE p_dps11z()
> LANGUAGE 'plpgsql' AS $BODY$
> BEGIN
> -- SELECT * TO REC FROM ...
>     NULL;
> END; $BODY$;
> 
> CALL pc_dps11e(500000);
> 
> PostgreSQL11自体のメモリリークを疑っているのですが、
> ご教授いただけたら幸いです。よろしくお願いします。
> 


______________________________________________________________________
 日本PostgreSQLユーザ会  高塚 遥  
 〒171-0022 東京都豊島区南池袋2-32-8 SRA OSS 日本支社 内 JPUG
 Mail: harukat @ postgresql.jp  TEL: 03-5979-2729


pgsql-jp メーリングリストの案内