[Reference:<_A394@delegate-ja.ML_>]
Newsgroups: mail-lists.delegate-ja
[DeleGate-Ja] Re: [DeleGate-Ja] Delegate 子プロセスがゾンビになる原因について
In message <_A394@delegate-ja.ML_> on 03/02/10(20:24:02)
you necss@北薗 <praaqbrv6-qa4rnugpcja6.ml@delegate.org> wrote:
|お世話になります。FILDG 北薗です。
...
|長時間ゾンビがいるわけではなく、waitシステムコール待ちで
|一瞬存在し、監視タイミングとバッティングして検知されている
|だけですので、監視ソフト側で精度をあげる方法を実装したいと思います。
|(長時間ゾンビは監視で検知し、wait待ちのゾンビは検知しないようにしたいと思います)
waitをする(子プロセスの終了を見届ける)のは親プロセスです。
子プロセスはただexitして貴賎なくゾンビになるのみです。親が
(いつ)waitして見届けてくれるかに関知することはできません。
SIGCHILDの件も、親が検出するように設定してくれているかどうか
によります。
ですので「wait待ちのゾンビ」というのは、概念的に無理がある
と思います(^^;)
|原理的にUnixでは全ての子プロセスがゾンビ状態になるものだと思います。
|つまり、親からfork()されてexit()したのち、親(権者)にwait()される
|まではゾンビなわけですよね。
|
|問題は、ゾンビのまま長時間残る、あるいは放念されて誰も掃除(wait)し
|ない放置状態になった場合で、これにより、リソースが不要に圧迫されたり、
|ソンビがソケットなどのリソースを握ったままになっている場合に、相手が
|切断待ちで終らないとか、サーバが再起動が出来ない、などの問題が発生
|します。
これらは実際にDeleGateでこれまでに出会った事例ですが、どちらかと
言いますと Unix よりも Windows での問題だったと思います。
また、ゾンビではなく、プロセスがソース握ったままで困った例としては、
巨大なログファイルやテンポラリファイルのディスクリプタ(やハンドル)
をオープンしたまま保持し続けていて、名前空間からは削除されてどこにも
ないダークマターとしてディスクを圧迫していた、というような事象も
ありました。
似た様な話として、私はここのところ、DeleGate版のリモートシェル yysh
<URL:http://www.delegate.org/yysh/> を開発しているのですが、
yysh クライアントから yysh サーバにログインして、yysh サーバを再起動する
と(yyshクライアント -> yyshサーバ => forkpty() => shell => yyshdサーバ)
親yyshサーバプロセスの保持していたディスクリプタがそのまま継承されて
累積し、これを繰り返すと、やがてディスクリプタがパンクする、という事象に
遭遇しました。しかもこの現象が発生するのが、BSD系/SysV系ということに
よらず、OS依存なのが不思議です。
|1対1で同期式の親子の場合には、fork()してすぐにwait()しますので、
|ゾンビはほとんど発生しませんが、DeleGateのように1対Nの親子式
|サーバの場合、親が、子供の後片付け(wait)よりも優先すべきと考える
|他の処理に関わっている間は、子供はゾンビのままになります。
|負荷が高い状況ではは、それが数秒間とかいうことも、あると思います。
|(確かに、SIGCHILD割り込みを受けてなるべく早く掃除するというオプ
|ションもありますが。最近のDeleGateでなら、子プロセスの終了処理を
|専門に行なうスレッドを導入するでしょうね。。。)
9 9
┌─┐┬┌──┬┐ //\^^ ( e ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)
|