[pgsql-jp: 41674] Re: DBLINK使用時に Out of Memory エラー
Masahide Oida
MOIDA @ jp.ibm.com
2014年 6月 3日 (火) 02:07:06 JST
花田さん、MauMauさん、ご回答ありがとうございました
DELETEのExplain取得のため再実行中(長時間ジョブ)ではあったのですが、
ログが大量なため確認に時間がかかりそうです。
MauMauさんご指摘のメモリリークについては
ソースを眺めてもよく分からなかった部分でもありましたので
助かりました。
修正(性能改善)前の9.2でも検証してみる価値がありそうですね
もしパッチが出る様でしたら是非とも確認してみたいと思います
-------------------------------------------------
種田 将英
Masahide OIDA, IBM Japan
ワークプレース.システムxサービス(6JC25)
mobile:080-6706-1731 JTAS-SE席 042-354-4488
From: "MauMau" <maumau307 @ gmail.com>
To: "PostgreSQL Japanese Mailing List" <pgsql-jp @ ml.postgresql.jp>
Date: 2014/06/02 23:50
Subject: [pgsql-jp: 41673] Re: DBLINK使用時に Out of Memory エラー
Sent by: pgsql-jp-bounces @ ml.postgresql.jp
MauMauです。
> 花田です。
>
> 「dblink temporary context:」が16万行程度でているということなので、おそ
> らくこられのメモリ使用量の合計が一番の原因だと思います。一つのDELETE文を
> 実行するのに16万回程度dblink('con', 'SELECT...')が実行されているようなの
> ですが、DELETE文の実行計画(ANALYZEオプションなし)をとることは可能ですか?
おそらく、9.2での次の性能改善に起因するメモリリークだと思います。
残念ながら、パラメータなど外部からの制御で問題を回避することはできなさそう
です。
Improve efficiency of dblink by using libpq's new single-row processing
mode
(Kyotaro Horiguchi, Marko Kreen)
dblinkでSQL文を実行する際、
dblink temporary contextというメモリコンテキストを作成します。
本来なら、contrib/dblink/dblink.cのstoreQuery()の最後で、
このメモリコンテキストを削除するのが正しいのでしょう。
これにより、dblinkの関数から復帰するときには、このメモリコンテキストがなく
なります。
今の実装だとおそらく、dblinkを呼び出すSQL文、今回だとDELETE文の終了時に、
削除し忘れたメモリコンテキストが自動的に削除されると推測します。
今回は1つのDELETE文で16万回dblink関数が呼ばれており、
それぞれの呼び出しが8KBのメモリをリークするため、1GB超のメモリが残ってし
まったものと思います。
有識者の方、正しいか確認いただけると幸いです。
よければ、コミュニティに修正パッチを送ってみます。
以上です。
pgsql-jp メーリングリストの案内