[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 メーリングリストの案内