ゾンビの状態がクリアされない場合、問題はありますか?


18

私は、Javaプロセスがゾンビになり、しばらくの間そこに残っていた生産ユニットを持っています。ユニットを再起動すると、クリアされます。ただし、ユニットは再起動されず、別のJavaプロセスが稼働しています。このゾンビ状態をクリアせずにそのままにしておくと問題はありますか?それは何らかの形で影響しますか(パフォーマンスまたは遅延)?

回答:


22

Zombieプロセスはシステムリソースを使い果たしないためZombieプロセスはパフォーマンスや速度に影響を与えません。

注:- 実際には、PID(限られたリソース)を使用しており、プロセスのカーネルデータ構造はまだ割り当てられています。通常、これはそれほど重要ではありませんが、カーネルメモリの使用量は、メモリが非常に限られているシステムでは非常に大きくなる可能性があります。

ゾンビプロセスが原因の問題

各ゾンビプロセスは、プロセスIDを保持します。LinuxシステムのプロセスIDの数は有限です(32ビットシステムではデフォルトで32767)。ゾンビが非常に速い速度で蓄積している場合、利用可能なPIDのプール全体が最終的にゾンビプロセスに割り当てられ、他のプロセスの起動を防ぎます。

:64ビットシステムでは、最大PIDを増やすことができます。https: //unix.stackexchange.com/a/16884/170373を参照してください

ただし、いくつかのゾンビプロセスがぶらぶらしていても問題はありません。ただし、システム上の親プロセスのバグを示しています。

説明:

Linuxでプロセスが停止しても、すべてがすぐにメモリから削除されるわけではありません。プロセス記述子はメモリに残ります。

プロセスのステータスがEXIT_ZOMBIEなり、プロセスの親は、子プロセスがSIGCHLDシグナルで停止したことを通知されます。

次に、親プロセスはwait()システムコールを実行して、デッドプロセスの終了ステータスとその他の情報を読み取ることになっています。これにより、親プロセスはデッドプロセスから情報を取得できます。wait()が呼び出された後、ゾンビプロセスはメモリから完全に削除されます。

通常、これは非常に迅速に行われるため、システムにゾンビプロセスが蓄積することはありません。ただし、親プロセスが適切にプログラミングされておらず、wait()を呼び出さない場合、ゾンビの子はクリーンアップされるまでメモリ内に残ります。

解決:

SIGKILLシグナルで通常のプロセスを強制終了できるため、ゾンビのプロセスを強制終了できません。ゾンビのプロセスはすでに停止しています。

ゾンビを殺す1つの方法は、SIGCHLDシグナルを親プロセスに送信することです。このシグナルは、親プロセスにwait()システムコールを実行し、ゾンビの子をクリーンアップするように指示します。killコマンドでシグナルを送信し、以下のコマンドのpidを親プロセスのPIDに置き換えます。

kill -s SIGCHLD pid

ゾンビを作成したプロセスが終了すると、initはゾンビプロセスを継承し、新しい親になります。(initは、ブート時にLinuxで開始される最初のプロセスであり、PID 1が割り当てられます。)

注: -Linux 3.4以降では、プロセスはPR_SET_CHILD_SUBREAPERオプションを使用してprctl()システムコールを発行できます。その結果、プロセス#1ではなく、それらが孤立した子孫プロセスの親になります。参照:https : //unix.stackexchange.com/a/177361/5132  

次に、INITはwait()システムコールを実行してゾンビの子をクリーンアップするため、initはゾンビを短時間で処理します。親プロセスを閉じた後に再起動できます。


wait()自体が失敗する可能性はありますか?
ラビ

3
64ビットシステムでは、最大PIDを増やすことができます。unix.stackexchange.com
a /

1
リペアレントに関する部分も間違っています。 unix.stackexchange.com/a/177361/5132 皮肉なことに、予期しないプログラムをサブリーパーにすることは、長期的なゾンビプロセスを引き起こす簡単な方法です。
JdeBP

2
親は、現在ゾンビになっているプロセスが終了したときに、すでにSIGCHLDを受信して​​います。
アンヘル

2
厳密に言えば、リソースを使用しないと言うのは正しくありません。PID(限られたリソース)を使用しており、プロセスのカーネルデータ構造はまだ割り当てられています。通常、これはさほど重要ではありませんが、メモリが非常に限られているシステムでは、カーネルのメモリ使用量がかなり大きくなる可能性があります。
オースティンヘメルガーン

6

ほとんどの場合、ゾンビは大きな問題ではありません。これらは「デッド」のようなプロセスであり、CPU時間はかかりません。また、割り当てられたメモリ、死ぬ前にプロセスによって解放されていなければなりません。実際に使用するリソースは、プロセスリストのエントリのみです。システムによっては、許可されるスレッドの最大数を設定できます。ゾンビを使用すると、理由もなくこの制限にすばやく到達できます。

ただし、ゾンビは通常、プログラマーがその子プロセスの状態を確認するのを忘れた不良/バギーコードのために表示されます。これは意図的なものですが、多くの場合そうではありません。不良/バグコードは、多くの場合、メモリを不適切 な特別な方法で処理し、割り当てられたリソースを解放しません。この場合、これらのリソースは、ゾンビが完全に終了するまで割り当てられたままになります。

編集:プロセスがJavaプログラムである場合、Javaガベージコレクターがすべてを処理するため、メモリの解放は問題になりません。


3
実際、ほとんどのOSでは、すべての言語でフィードメモリが発行されるわけではありません。システムは、親プロセス用のごくわずかな量を除くすべてのメモリを解放します。
ヴァルは、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.