Apache2.2のInternal cummy connection
(以下、引用)
- Apache 2.2 から graceful-stop ができた。
- その絡みでサーバの子プロセスを安全に shutdown する仕組みができた。
- それが pipe-of-death (pod)。親が子に氏ねっていう仕組み(パイプ)。
- 各 MPM で pod を自力で実装することもできるし mpm_common.c の pod を使うこともできる。
- mpm_common.c の pod では子プロセスに氏ねっていった後に dummy_connection を行う(後述)。
- prefork MPM では AP_MPM_USES_POD を #define してるんで mpm_common.c のを使う。
- worker MPM では自力で実装してる。
- なんでとりあえず prefork MPM について考えますね。
- *** このへんからあやふやになります ***
- 親が子を殺したい。Max Requests Per Child 越えたとか Max Spare Servers を越えたとか shutdonw 時とか。
- そんなときは親が子に ap_mpm_pod_signal を使って「氏ね」って言う。
- 子プロセスがクライアントと通信中だったらそれが終わったら ap_mpm_pod_check で自分が殺されたかどうか調べて自分で死ぬ(graceful stop)。
- そじゃなかったら?子は accept して待っている。OS によっては kernel 内でブロッキングしてるかも。
- そういう子プロセスの accept の時間切れまで待つのは悠長。
- だから dummy_connection してやる。すると子は accept からとりあえず抜け,単純なリクエスト(= dummy_connection)を処理し自分で死ぬ。