apacheの子プロセスがなぜゾンビプロセス化してしまうのか。
ゾンビプロセスは、実態は存在しないが、プロセス・テーブル内で認識される (PID番号を持っている) 非活動プロセスです。
Apacheは親プロセスがリクエストに応答するの子プロセス生成や終了をしていきますので、適切に子プロセスが処理されなかったときにゾンビ化します。
Apahce単体での使用で子プロセスがゾンビ化することはまず見受けられませんが、phpやPassenger(mod_rails)などのmoduleを使用した場合、module側の処理が原因(処理が遅かったり終わらなかったり)でゾンビ化したままプロセスが滞留していることをよく見受けます。
安全な再起動とかあるの?
Apacheにはいくつかの起動・停止方法があり、親プロセスにシグナルを送ることで起動・停止(再起動)方法が異なります。
通常のstopコマンド(init.d配下のスクリプトや、serviceやsystemd使用すると仮定)は、
内部的には kill -WINCH ${MAINPID}
をシグナルとして親プロセスに送信しています。
これは子プロセスが処理を終了してから逐次stopしていく方法です。
同様に、子プロセスの処理を終了してから逐次新たなプロセスを生成していくGraceful Restartがあります。
それを回避するには、どんな再起動を行えばいいのか。
システムやアプリケーションの都合上、どうしてもゾンビ化したプロセスが滞留してしまうということがあると思います。
その場合は、cronでの定期的な再起動や、monit等でプロセスを監視し、自動で再起動をかけたりする運用がいいと思われます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。