[pgsql-jp: 33894] Re: pgpool のエラー(pool_read: EOF encountered)

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 8月 19日 (木) 23:40:22 JST


石井です.

> 三谷@広島です.
> 
> > 以下のようなエラーが発生し、pgpoolが止まってしまう事があります。
> > ERROR: pid 17764: pool_read: EOF encountered
> > ERROR: pid 17764: ProcessFrontendResponse: failed to read kind
> > あるいは、
> > ERROR: pid 14363: pool_read: read failed (Connection reset by peer)
> > ERROR: pid 14363: ProcessFrontendResponse: failed to read kind
> > または、
> > ERROR: pid 18550: pool_read: EOF encountered
> > ERROR: pid 18550: ProcessFrontendResponse: failed to read kind
> > ERROR: pid 18550: pool_flush: fflush failed (Broken pipe)
> これらはいずれも,フロントエンド(この場合はphpのアプリですね)が,通常
> の終了処理を行わずに突然セッションを切ってしまっているために発生するエラー
> メッセージだと思います.

phpではスクリプトが終了処理(pg_close())を呼び出さなくても,自動的に
pg_close()が呼び出されるので,普通は問題なりません.あるとすれば,
Apacheごと死んでいるとか,OSのネットワークレイヤで異常が起きている場合
だけです(PHP<--->pgpoolの間の接続はUNIXドメインソケットでしょうか,そ
れともINETドメインソケットでしょうか?).

# 私はネットワークとかカーネルに詳しくないので,どうしてlこういう状態に
# なるか誰か解説してくれると嬉しいです.

> > 過負荷状態においてpgpoolが上記のエラー
> > を出力する事に気が付きました。
> pgpoolがこれらのエラーを吐いている時にアプリ側のプロセスがどうなっている
> かを確認された方が良いかもしれません.
> 
> > エラーが発生した後は、一切pgpoolに
> > よる接続が出来なくなります。
> 手元の環境でpgpoolを起動し,psqlで接続したフロントエンドをkillで叩き切っ
> てみましたが,再接続は問題なく出来ました.
> 接続数を1にしても同様ですので,フロントエンドを叩き切ったくらいでは再現
> しないのかもしれません.

過負荷状態なのかも知れませんね.pool_process_query.cの1300行目辺りに

	if (pool_read(frontend, &fkind, 1) < 0)
	{
		pool_error("ProcessFrontendResponse: failed to read kind");
		return POOL_END;
	}

というのがあります.ここで

		return POOL_END;
を
		return POOL_ERROR;

にすると,pgpoolの子プロセスが自殺し,代りに新しい子プロセスを作るので,
ひょっとしたら問題を回避できるかも知れません.コネクションプールがクリ
アされるので,ちょっともったいですが.
--
Tatsuo Ishii



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