ゾンビプロセスを見てみる
概要
プロセスについて調べていたら、ゾンビプロセスというものを見つけました。
自分のPCにどれだけいるのか見てみました。
対象読者
ゾンビプロセス?という方
ゾンビプロセスに不快感を持った方
ゾンビプロセスとは
プロセスとしては終了しているが、プロセステーブルに残ってしまっている状態。
通常プロセスが終了すると、親プロセスがwait()というシステムコールで子プロセスのPIDを解放するが、なんらかの問題でwait()できないとゾンビプロセスが誕生する。
CPUやメモリリソースを消費することはないが、プロセスには規定の物理メモリ領域が割り当てられるので、大量にいると問題が発生することがある。
Docker環境ではゾンビプロセスが発生しやすいらしい。
Dockerでゾンビプロセスが発生しやすい理由
親プロセスが異常終了してwaitされない場合、子プロセスはinitの子となる。
通常のinitプロセスは定期的にwait()を行ってくれるので、ゾンビが残らない。
しかし、Dockerではコンテナで実行するメインプロセスがinitプロセスとなるため、wait()を持ち合わせていないのでゴミプロセスが残ってしまう。
ゾンビプロセスを確認
ps aux
コマンドのSTATの出力がZのものがそう。
MacOsの場合、pstreeというものを入れればプロセスの親子関係が見れる。
自分のPCにもGoogleアプリケーションの子プロセスにゾンビがいました。<defunct>になっているのがそうです。
ゾンビプロセスを退治する方法
ゾンビプロセスにSIGTERMを送レバ消えると説明されている記事もありましたが、自分の環境では消えませんでした。
その場合は、親プロセスをkillして、initプロセスの子にしてしまえば、勝手にwaitされて消えるとのこと。
親プロセスを落とすとゾンビプロセスたちもいなくなりました。
もちろんPCを再起動しても、全てのプロセスが初期化されるため掃除できます。
まとめ
特にいても不都合はないので意識して削除することはないですが、自分のPCの中にこういったプロセスがいるというのが知れてよかったです。
退治といってもシグナルを送ってどうこうするより、根本原因の対象が必要です。(特定は難しそうですが。。)
Discussion