私はHP-UXシステムを使用していましたが、以前の管理者がシステムに存在できるゾンビプロセスの数に上限があると言いましたが、私の考えでは1,024個だと思います。
- これは確かな事実キャップですか?プロセス数が無制限であるかのようにゾンビもいくらでもあると思ったが…?
- 分布ごとに値が異なりますか?
- 限界に達して別のゾンビを生成しようとするとどうなりますか?
ベストアンサー1
私はHP-UXが利用できず、HP-UXのファンになったこともありません。
Linuxでは、プロセスごとまたはユーザーごとに存在できるサブプロセスの数に制限があるようです。limit
Zsh組み込みを使用して確認できます(ulimit -u
bashに似ているようです)。
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 6079
2つの異なるプロセスが実行されています。sshd
上記のプログラムのゾンビではなく最初のインスタンスを追加すると、6079が発生します。
fork(2)
「リソースは一時的に使用できません。」エラーが原因でシステムコールが失敗します。どのリソースが利用できないかという他の証拠はありません。同時に、2つの異なるxtermで私のプログラムを実行すると別の数字が得られますが、合計すると1つのxtermで実行するのと同じ数になります。私はそれがランダムな制限ではなく、プロセステーブルエントリ、スワップ、またはシステム全体のリソースであると仮定します。
今はもう試すことはありません。