のようなコマンドtop
とGUIベースSystem Monitor
では、現時点でいくつかのゾンビプロセスがあることがわかります。
ゾンビプロセスとは何ですか?
それらは、ゾンビになっているシステムまたはアプリケーションのパフォーマンスに影響しますか?使用しているメモリが多すぎますか、それともメモリを使用しますか?
のようなコマンドtop
とGUIベースSystem Monitor
では、現時点でいくつかのゾンビプロセスがあることがわかります。
ゾンビプロセスとは何ですか?
それらは、ゾンビになっているシステムまたはアプリケーションのパフォーマンスに影響しますか?使用しているメモリが多すぎますか、それともメモリを使用しますか?
回答:
ゾンビは死んだプロセスです。彼らは「殺す」ことはできません(DEADを殺すことはできません)。すべてのプロセスは最終的に死に、それらが実行されるとゾンビになります。彼らはリソースをほとんど消費しませんが、それは彼らが死んでいるからです!ゾンビの理由は、ゾンビの親(プロセス)がゾンビの終了ステータスとリソース使用統計を取得できるようにするためです。親は、wait()システムコールの1つを使用して、ゾンビが不要になったことをオペレーティングシステムに通知します。
プロセスが停止すると、その子プロセスはすべてプロセス番号1の子になります。これはinitプロセスです。Initは「常に」子供が死ぬのを待っているので、子供がゾンビとして残ることはありません。
ゾンビプロセスがある場合は、それらのゾンビが親によって待機されていないことを意味します(で表示されるPPIDを見てくださいps -l
)。3つの選択肢があります。親プロセスを修正します(待機させます)。親を殺します。またはそれと一緒に暮らす。ゾンビはpsの出力で余分な行を1つ以上使用するため、それと一緒に生活することはそれほど難しくありません。
ゾンビは、STAT列に「Z」が存在することにより、Unixのpsコマンドからの出力で識別できます。短期間以上存在するゾンビは、通常、親プログラムのバグを示しています。他のリークと同様に、いくつかのゾンビの存在自体は気になりませんが、より重い負荷の下で深刻になる問題を示している可能性があります。
システムからゾンビを除去するには、killコマンドを使用して、SIGCHLDシグナルを親に手動で送信できます。親プロセスがゾンビの刈り取りを拒否する場合、次のステップは親プロセスを削除することです。プロセスが親を失うと、initはその新しい親になります。Initはwaitシステムコールを定期的に実行して、initを親として使用するゾンビを獲得します。
親プロセスが終了または終了したコンピュータープロセスである孤立プロセスもあります。
サーバーの要求を行った後にクライアントプロセスがクラッシュすると、リモート呼び出し中にプロセスが孤立する可能性があります。
孤児はサーバーリソースを浪費し、サーバーをトラブルにさらす可能性があります(これはゾンビと孤児の最大のリソースの違いです(孤児ゾンビムービーを見る場合を除く)。しかし、孤児プロセスの問題にはいくつかの解決策があります。
駆除は、最も一般的に使用される手法です。この場合、孤立プロセスは強制終了されます。
転生は、マシンが定期的にリモート計算の親を見つけようとする手法です。その時点で、孤立プロセスが強制終了されます。
有効期限は、各プロセスを強制終了してから終了するまでの一定の時間を割り当てる手法です。必要に応じて、割り当てられた時間が経過する前に、プロセスが終了するまでの時間を「求める」ことができます。
プロセスは、親プロセスと同じマシンで実行されている孤立することもできます。UNIXライクなオペレーティングシステムでは、孤立したプロセスは特別な「init」システムプロセスによって直ちに採用されます。この操作は再ペアレント化と呼ばれ、自動的に実行されます。技術的にはプロセスには親として「init」プロセスがありますが、元々プロセスを作成したプロセスが存在しないため、孤立プロセスと呼ばれます。
詳細:
http://wiki.answers.com/Q/What_is_Zombie_Process_and_Orphan_Process#ixzz1PCN9vojU
http://www.linuxsa.org.au/tips/zombies.html
http://www.brighthub.com/computing/linux/articles/79186.aspx
init
wait
ゾンビ、孤立(採用)、生物学的(自己生成)のすべての子プロセスを呼び出しますか?
ゾンビプロセス(としても表示<defunct>
)は、実際のプロセスではありません。これらは、カーネルプロセステーブルの単なるエントリです。これは、彼らが消費する唯一のリソースです。CPUやRAMを消費しません。ゾンビを持つ唯一の危険は、プロセステーブルのスペースが不足することです(cat /proc/sys/kernel/threads-max
システムで許可されているエントリの数を確認するために使用できます)。
それらは、親プロセス(つまり、親プロセスfork()'ed
)が生きているときにのみ表示されますが、まだwait()
システム関数を呼び出していません。親が死んだ後は、ゾンビがあるwait()'ed
ことによってのためにinit
と消えます。
top
で`スクリーンショットこの質問はあなたと矛盾するようですか?そこでは、ゾンビは1つのCPUの100%を使用しているように見えますが、メモリは使用していません。
ゾンビプロセスは実行を停止したプロセスですが、親プロセスがwait syscallを介して取得していないため、プロセステーブルエントリはまだ存在しています。技術的には、終了する各プロセスは非常に短期間ゾンビですが、より長く生きることができます。
子プロセスが終了した後、親プロセスがwait syscallを呼び出さない場合、より長く存続するゾンビプロセスが発生します。これが発生する状況の1つは、親プロセスの記述が不十分で、単に待機呼び出しを省略した場合、または子プロセスの前に親プロセスが終了し、新しい親プロセスが待機を呼び出さない場合です。プロセスの親が子の前に死ぬと、OSは子プロセスを「init」プロセスまたはPID 1に割り当てます。つまり、initプロセスは子プロセスを「採用」し、その親になります。つまり、子プロセスが終了すると、新しい親(init)はwaitを呼び出して終了コードを取得するか、プロセステーブルエントリが永遠に残り、ゾンビになります。