ゾンビプロセスの数に上限はありますか?

ゾンビプロセスの数に上限はありますか?

私はHP-UXシステムを使用していましたが、以前の管理者がシステムに存在できるゾンビプロセスの数に上限があると言いましたが、私の考えでは1,024個だと思います。

  • これは確かな事実キャップですか?プロセス数が無制限であるかのようにゾンビもいくらでもあると思ったが…?
  • 分布ごとに値が異なりますか?
  • 限界に達して別のゾンビを生成しようとするとどうなりますか?

答え1

私はHP-UXが利用できず、HP-UXのファンになったこともありません。

Linuxでは、プロセスごとまたはユーザーごとに存在できるサブプロセスの数に制限があるようです。limitZsh組み込みを使用して確認できます(ulimit -ubashに似ているようです)。

1002 % limit
cputime         unlimited
filesize        unlimited
datasize        unlimited
stacksize       8MB
coredumpsize    0kB
memoryuse       unlimited
maxproc         16136
  ...

これはArch Linuxノートブックにあります。

私はこの制限をテストするために小さなプログラムを書いています。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

volatile int sigchld_cnt = 0;

voida
sigchld_hdlr(int signo)
{
        ++sigchld_cnt;
}

int
main(int ac, char **av)
{
        int looping = 1;
        int child_cnt = 0;
        int status;

        signal(SIGCHLD, sigchld_hdlr);

        printf("Parent PID %d\n", getpid());

        while (looping)
        {
                switch (fork())
                {
                case 0:
                        _exit(0);
                        break;
                case -1:
                        fprintf(stderr, "Problem with fork(), %d children: %s\n",
                                child_cnt, strerror(errno));
                        looping = 0;
                        break;
                default:
                        ++child_cnt;
                        break;
                }
        }

        fprintf(stderr, "Sleeping, forked %d child processes\n", child_cnt);
        fprintf(stderr, "Received %d sigchild\n", sigchld_cnt);
        sleep(10);

        looping = 1;
        do {
                int x = wait(&status);

                if (x != -1)
                        --child_cnt;
                else if (errno != EINTR) {
                        fprintf(stderr, "wait() problem %d children left: \%s\n",
                                child_cnt, strerror(errno));
                        looping = 0;
                }
        } while (looping);

        printf("%d children left, %d SIGCHLD\n", child_cnt, sigchld_cnt);

        return 0;
}

すべてのゾンビを「収集」するのに十分な回数を召喚するのは非常に困難ですwait(2)。さらに、受信されたSIGCHLD信号の数は、フォークされたサブプロセスの数と決して同じではありません。私はLinuxカーネルが時々複数のシャットダウンサブプロセスに対して1 SIGCHLDを送ると思います。

wait(2)とにかく私のアーチLinuxノートブックでは16088の子プロセスをフォークしましたが、プログラムはシグナルハンドラでシステムコールを実行しないため、ゾンビプロセスの実行に間違いありません。

私のSlackware 12サーバーには、私のユーザーIDと同じ6076のサブプロセスがあり、Zshと一緒にmaxproc 60792つの異なるプロセスが実行されています。sshd上記のプログラムのゾンビではなく最初のインスタンスを追加すると、6079が発生します。

fork(2)「リソースは一時的に使用できません。」エラーが原因でシステムコールが失敗します。どのリソースが利用できないかという他の証拠はありません。同時に、2つの異なるxtermで私のプログラムを実行すると別の数字が得られますが、合計すると1つのxtermで実行するのと同じ数になります。私はそれがランダムな制限ではなく、プロセステーブルエントリ、スワップ、またはシステム全体のリソースであると仮定します。

今はもう試すことはありません。

答え2

HP-UXの制限が何であるかわかりません。ただし、論理実装は最大サイズのプロセステーブルを持つと言うことができます。理論的には、プロセステーブルエントリの総数はプロセスIDの範囲によって制限されますが、ほとんどの実装にはテーブルサイズ制限があり、最大値が小さくなります。ほとんどのUnixバリアントには、ユーザーあたりのプロセス数に制限があります。 bashで実行すると制限を確認できますulimit -u

私は、UNIXシステムがプロセスID(実際のプロセスとゾンビの両方)の数に別々の制限を設定するのではなく、ゾンビに別々の制限を設定したくありません。したがって、プロセスが終了してゾンビになっても、これは制限には影響しません。プロセスが分岐するとリソース(プロセステーブルのエントリ)が割り当てられ、プロセスがリサイクルされると解放されます。

答え3

プロセス数が無制限であるかのようにゾンビもいくらでもあると思ったが…?

ゾンビプロセスは最終的に特殊な状態のプロセスであり、ゾンビプロセスはプロセステーブルの可用性とサイズによって制限されます。定期的なプロセス。

分布ごとに値が異なりますか?

もちろん、他のパラメータもたくさんあります。特定のサイズまたは多くのゾンビプロセスに対応するのに十分な大きさであるかどうかに依存してはいけません。ゾンビが多すぎると結局いっぱいになるので、ソリューションは大きなテーブルではありません。ゾンビプロセス自体は悪くありませんが、あまりにも多くのゾンビプロセスが蓄積されている場合、ゾンビプロセスを可能にする「誤動作」プログラムがあることを示します。

限界に達して別のゾンビを生成しようとするとどうなりますか?

プロセステーブルが通常のプロセスとゾンビプロセスでいっぱいになると、システムに十分なリソース(メモリ、プロセッサなど)がある場合でも、新しい一般プロセスを作成できません。唯一の欠落リソースはプロセステーブルのエントリです。すでに実行されているプログラムは、「正常に動作している」プログラムであっても、子プロセスを作成する必要があると失敗し始めます。新しいプログラムが起動せず、単一のコマンドの実行も失敗します。

関連情報