[pgsql-jp: 41666] DBLINK使用時に Out of Memory エラー

Masahide Oida MOIDA @ jp.ibm.com
2014年 6月 2日 (月) 12:33:15 JST


日本IBM 種田と申します

少し前に別件でお邪魔しておりますが(そちらは未解決のままですが)、
新たに問題が発生したため、有識者の方々にお伺い出来ればと考えております

【環境】
 ・サーバ:VMWare仮想サーバ 仮想8core/16GBメモリ
 ・OS:Win2012(64bit)
  アプリケーションサーバ:Apache 2.2.25+Tomcat6.0.29
  DBMS:PostgreSQL 9.3.4(32bit)

上記サーバ上にDB-A,DB-B 2つのデータベースを作成し、
DBLINKにてDB-A上のPL/pgSQLが、DB-B上のテーブルからキー情報を取得し、
データ削除処理を行っています。

実行してみたところ、PostgreSQLログにメモリダンプを出力し、
SQLERRMがOut of Memory(SQLSTATE 53200)で異常終了しました

メモリダンプが相当大きいのですが以下の様な感じで出力されています:

TopMemoryContext: 22517376 total in 2750 blocks; 48648 free (2746 chunks);
22468728 used
  PL/pgSQL function context: 57344 total in 3 blocks; 2368 free (1 chunks);
54976 used
  :
  TopTransactionContext: 8192 total in 1 blocks; 5520 free (0 chunks); 2672
used
    CurTransactionContext: 0 total in 0 blocks; 0 free (0 chunks); 0 used
    SPI Exec: 131072 total in 5 blocks; 57688 free (0 chunks); 73384 used
      ExecutorState: 49272 total in 4 blocks; 5336 free (19 chunks); 43936
used
        ExprContext: 0 total in 0 blocks; 0 free (0 chunks); 0 used
        ExprContext: 0 total in 0 blocks; 0 free (0 chunks); 0 used
        ExprContext: 8192 total in 1 blocks; 7248 free (0 chunks); 944 used
          dblink temporary context: 0 total in 0 blocks; 0 free (0 chunks);
0 used
          dblink temporary context: 8192 total in 1 blocks; 8176 free (0
chunks); 16 used
          dblink temporary context: 8192 total in 1 blocks; 8176 free (0
chunks); 16 used
          dblink temporary context: 8192 total in 1 blocks; 8176 free (0
chunks); 16 used
      :
      : 16万行
      :
          dblink temporary context: 8192 total in 1 blocks; 8176 free (0
chunks); 16 used
        ExprContext: 0 total in 0 blocks; 0 free (0 chunks); 0 used
    SPI Proc: 24576 total in 2 blocks; 8720 free (6 chunks); 15856 used
    CurTransactionContext: 24576 total in 2 blocks; 11128 free (4 chunks);
13448 used
    CurTransactionContext: 24576 total in 2 blocks; 11128 free (4 chunks);
13448 used
   :
  MessageContext: 8192 total in 1 blocks; 7072 free (0 chunks); 1120 used
  :
  TransactionAbortContext: 32768 total in 1 blocks; 32752 free (0 chunks);
16 used
  Portal hash: 8192 total in 1 blocks; 3912 free (0 chunks); 4280 used
  PortalMemory: 8192 total in 1 blocks; 8040 free (1 chunks); 152 used
   :
  CacheMemoryContext: 1208968 total in 22 blocks; 478088 free (2 chunks);
730880 used
    CachedPlan: 15360 total in 4 blocks; 3136 free (0 chunks); 12224 used
   :
  MdSmgr: 8192 total in 1 blocks; 6832 free (0 chunks); 1360 used
  LOCALLOCK hash: 8192 total in 1 blocks; 824 free (0 chunks); 7368 used
  Timezones: 79320 total in 2 blocks; 5968 free (0 chunks); 73352 used
  ErrorContext: 8192 total in 1 blocks; 8176 free (0 chunks); 16 used


DBLINKについては
「ローカル側に必要なデータを持ってきてしまうためメモリ不足に気をつけるよう
に」
の記載が事例等を調べると出てきますので、今回もそれにあたる可能性はあるので
すが、
以下ご教示頂けないでしょうか

(1)仮にメモリ不足になっているとして、出来る範囲でパラメータで対応しようとし
た場合、
 PostgreSQLパラメータの何を増加させれば良いでしょうか
 以下事例では仕組みはわかりませんがOut of Memoryに対して shared_buffer を
増加させて対応出来た事例がありました:

http://www.postgresql.org/message-id/BLU171-W66299F9AFA9F4C41542E49BEEF0@phx.gbl


 ※DBLINK処理イメージを添付致します

CREATE OR REPLACE FUNCTION aaa(
	character varying)
  RETURNS character varying AS
$BODY$
DECLARE
 :
BEGIN
 PERFORM (SELECT DBLINK_CONNECT('conn','dbname=DB-B user=postgres'));
   DELETE FROM tbl0010 dba
     WHERE EXISTS
	   (
	   SELECT tbl0010_cd FROM tbl0010
	   INNER JOIN (
               SELECT * FROM DBLINK
               ('conn','
		  SELECT tbl0411_cd FROM tbl0411
                INNER JOIN(
                   :
                   :
  ※上記数千〜10万行のDELETEを10個程度記載

EXCEPTION
  WHEN OTHERS THEN ...
  PERFORM (SELECT DBLINK_DISCONNECT('conn'));
END;


(2)別な事例でDBLINKについて製品バグでメモリリークが発生しており、
 Updateで解消しているケースがありました。

http://grokbase.com/t/postgresql/pgsql-general/0862j7bxg1/dblink-cursor-error-issue-topmemorycontext
 (1)の内容次第かと思いますが、まめにメモリ開放させる様な回避策は考えられま
すでしょうか

よろしくお願い致します


-------------------------------------------------
種田 将英
Masahide OIDA,  IBM Japan
ワークプレース.システムxサービス(6JC25)
mobile:080-6706-1731  JTAS-SE席 042-354-4488



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