[pgsql-jp: 38517] Re: pgpoolがささり、子プロセスがゾンビになる現象が発生

KAJI Wataru waasuke @ medaka-college.com
2007年 6月 20日 (水) 17:01:09 JST


鹿持@メダカカレッジです。

ども。
過去の ML で書いてた者です。
最近の pgpool はおっかけてないのですが、2.5 系列を現在も使ってます。

At Tue, 19 Jun 2007 23:28:05 +0900,
TAKAO Kouji wrote:

> ある程度pgpoolを動かし続けていると、pgpoolのプロセスがささり、未接続の
> pgpoolの子プロセスがゾンビ状態になる現象が発生しています。3日で発生す
> ることもあれば、1ヶ月なこともあり、とりあえず、1日1回pgpoolを再起動さ
> せるようにして、その場をしのいでいます。
[snip]
> 上記を元に、シグナルハンドラの中で、forkしている可能性があると思い、ソー
> スコードを確認しました。すると、main.cにSIGCHLDのシグナルハンドラで
> forkしていることが分かりました。
> 
> ----- ここから -----
> ...
>     pool_signal(SIGCHLD, reap_handler);
> ...
> static RETSIGTYPE reap_handler(int sig)
> {
> ...
>     /* if found, fork a new child */
>     if (!switching && !exiting && status)
>     {
>         pids[i] = fork_a_child(unix_fd, inet_fd);
>         pool_debug("fork a new child pid %d", pids[i]);
>         break;
>     }
> ...
> }
> ----- ここまで -----
> 
> 今回、私の環境で発生したpgpoolがささり、子プロセスがゾンビになる現象は、
> シグナルハンドラ中でforkしていることが原因ではないかと想像しています。

やっぱりここ気持ちわるいんですよね。
自分は子プロセスが、しばらくアクセスがこなかったのしても、
自動的に死なないようにハックして使ってます。
ようするに、ここに来る前で止めてる感じ。

> > そして、子 pgpool の看取りは waitpid(WNOHANG) でやっていますし、
> > 子の再起動のための fork_a_child(reap_handler)を signal handler から
> > 呼ぶのではなく、main() のメインループの中から定期的にキックするようにする、
> > というアイディアもあると思うんですがいかがでしょう?
> とりあえずこちらの方向で検討します.heal checkを動かしているときに,起
> 動するタイミングを探すのがちょっと微妙ではありますが.
> ----- ここまで -----
> 
> 上記はかなり前の話しなので、修正されているのかなと思っていましたが、
> ソースコードを確認したところ、現在も同様の状態だと考えています。
> 「main() のメインループの中から定期的にキックするようにする」というの
> は、どうなのでしょうか。何か難しい点や、問題などがあったのでしょうか。

浅羽さんがコメントしてくださっていますが、自分もシグナルハンドラの中では
フラグセットだけにするのが好ましいと思ってまして、
ここのロジックが変更されることに期待です。

# コード書かずに要望言うだけで恐縮なんですが。。。^^;


● from: KAJI Wataru <waasuke @ medaka-college.com>
● 鹿持 渉 @ メダカカレッジ
● http://www.medaka-college.com/



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