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

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 8月 25日 (水) 10:32:40 JST


石井です.

> pgpool 2.0.7を利用していますが、エラーメッセージの意味と対処方法
> についてご存知の方いらっしゃいましたらご教示頂けたらと思います。
> 
> 以下のようなエラーが発生し、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)
> 
> 現在、あるシステムで大変な過負荷でシステムを稼動させています。これ
> 自体とても良くない事ですが、過負荷状態においてpgpoolが上記のエラー
> を出力する事に気が付きました。エラーが発生した後は、一切pgpoolに
> よる接続が出来なくなります。pgpoolのプロセスそのものは生きている
> ようです。現在、監視しながら問題発生時にpgpoolを再起動するか、
> 監視員が不在の時間帯はpgpoolを利用しない事で対処しています。

昨日三谷さんに教えてもらったのですが,blockするソケット経由で読み書き
すると過負荷時にうまく動作しないことがある,高負荷が予想される場合は
non blockなソケットを使うべき,ということのようです.これが本件の問題
点そのものであるのかどうかはわかりませんが,pgpool <--> フロントエンド
の通信ソケットをnon blockにするパッチを作ってみました.よかったらお試
し下さい(2.0.8用ですが,たぶん2.0.7にもあたると思います).

なお,pgpool <--> バックエンドのソケットはすでに non blockになっていま
す.
--
Tatsuo Ishii

------------------------------ cut here -------------------------------
Index: child.c
===================================================================
RCS file: /home/t-ishii/repository/pgpool/child.c,v
retrieving revision 1.33
diff -c -r1.33 child.c
*** child.c	19 Jul 2004 01:28:44 -0000	1.33
--- child.c	25 Aug 2004 00:31:37 -0000
***************
*** 48,54 ****
--- 48,56 ----
  #ifdef NONE_BLOCK
  static void set_nonblock(int fd);
  #endif
+ #ifdef NOT_USED
  static void unset_nonblock(int fd);
+ #endif
  
  static POOL_CONNECTION *do_accept(int unix_fd, int inet_fd);
  static StartupPacket *read_startup_packet(POOL_CONNECTION *cp);
***************
*** 105,112 ****
--- 107,116 ----
  			continue;
  		}
  
+ #ifdef NOT_USED
  		/* set frontend fd to blocking */
  		unset_nonblock(frontend->fd);
+ #endif
  
  		/* disable timeout */
  		pool_disable_timeout();
***************
*** 323,328 ****
--- 327,333 ----
  }
  #endif
  
+ #ifdef NOT_USED
  /*
   * unset non-block flag
   */
***************
*** 343,348 ****
--- 348,354 ----
  		exit(1);
  	}
  }
+ #endif
  
  /*
  * perform accept() and returns new fd
Index: main.c
===================================================================
RCS file: /home/t-ishii/repository/pgpool/main.c,v
retrieving revision 1.16
diff -c -r1.16 main.c
*** main.c	13 Aug 2004 11:45:59 -0000	1.16
--- main.c	23 Aug 2004 12:09:49 -0000
***************
*** 329,335 ****
  				   path, strerror(errno));
  		exit(1);
  	}
! 	snprintf(pidbuf, sizeof(pidbuf), "%d", getpid());
  	fwrite(pidbuf, strlen(pidbuf), 1, fd);
  	if (fclose(fd))
  	{
--- 329,335 ----
  				   path, strerror(errno));
  		exit(1);
  	}
! 	snprintf(pidbuf, sizeof(pidbuf), "%d", (int)getpid());
  	fwrite(pidbuf, strlen(pidbuf), 1, fd);
  	if (fclose(fd))
  	{
Index: pool_error.c
===================================================================
RCS file: /home/t-ishii/repository/pgpool/pool_error.c,v
retrieving revision 1.6
diff -c -r1.6 pool_error.c
*** pool_error.c	19 Jul 2004 01:28:44 -0000	1.6
--- pool_error.c	23 Aug 2004 12:10:27 -0000
***************
*** 35,41 ****
  {
  	va_list		ap;
  
! 	fprintf(stderr, "ERROR: pid %d: ", getpid());
  	va_start(ap, fmt);
  	vfprintf(stderr, fmt, ap);
  	va_end(ap);
--- 35,41 ----
  {
  	va_list		ap;
  
! 	fprintf(stderr, "ERROR: pid %d: ", (int)getpid());
  	va_start(ap, fmt);
  	vfprintf(stderr, fmt, ap);
  	va_end(ap);
***************
*** 49,55 ****
  	if (!debug)
  		return;
  
! 	fprintf(stderr, "DEBUG: pid %d: ", getpid());
  	va_start(ap, fmt);
  	vfprintf(stderr, fmt, ap);
  	va_end(ap);
--- 49,55 ----
  	if (!debug)
  		return;
  
! 	fprintf(stderr, "DEBUG: pid %d: ", (int)getpid());
  	va_start(ap, fmt);
  	vfprintf(stderr, fmt, ap);
  	va_end(ap);
***************
*** 60,66 ****
  {
  	va_list		ap;
  
! 	fprintf(stderr, "LOG: pid %d: ", getpid());
  	va_start(ap, fmt);
  	vfprintf(stderr, fmt, ap);
  	va_end(ap);
--- 60,66 ----
  {
  	va_list		ap;
  
! 	fprintf(stderr, "LOG: pid %d: ", (int)getpid());
  	va_start(ap, fmt);
  	vfprintf(stderr, fmt, ap);
  	va_end(ap);
Index: pool_stream.c
===================================================================
RCS file: /home/t-ishii/repository/pgpool/pool_stream.c,v
retrieving revision 1.21
diff -c -r1.21 pool_stream.c
*** pool_stream.c	19 Jul 2004 01:28:44 -0000	1.21
--- pool_stream.c	25 Aug 2004 00:42:08 -0000
***************
*** 124,129 ****
--- 124,138 ----
  			}
  		}
  
+ 		else if (!cp->isbackend)
+ 		{
+ 			if (pool_check_fd(cp, 0))
+ 			{
+ 				pool_error("pool_read: pool_check_fd failed (%s)", strerror(errno));
+ 			    return -1;
+ 			}
+ 		}
+ 
  		readlen = read(cp->fd, readbuf, READBUFSZ);
  		if (readlen == -1)
  		{
***************
*** 216,221 ****
--- 225,239 ----
  			{
  				pool_log("pool_read2: secondary data is not ready. abort this session");
  				exit(1);
+ 			}
+ 		}
+ 
+ 		else if (!cp->isbackend)
+ 		{
+ 			if (pool_check_fd(cp, 0))
+ 			{
+ 				pool_error("pool_read2: pool_check_fd failed (%s)", strerror(errno));
+ 			    return NULL;
  			}
  		}
  
------------------------------ cut here -------------------------------



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