좀비 프로세스 수에 상한이 있나요?

좀비 프로세스 수에 상한이 있나요?

저는 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)어쨌든 내 아치 리눅스 노트북에서는 16088개의 자식 프로세스를 포크했는데, 프로그램이 신호 처리기에서 시스템 호출을 수행 하지 않기 때문에 좀비 프로세스 수임에 틀림없다 .

내 Slackware 12 서버에는 내 사용자 ID와 동일한 6076개의 하위 프로세스가 있으며 Zsh와 함께 maxproc 60792개의 다른 프로세스가 실행 중입니다 . sshd위 프로그램의 좀비가 아닌 첫 번째 인스턴스를 추가하면 6079가 발생합니다.

fork(2)"리소스를 일시적으로 사용할 수 없습니다." 오류로 인해 시스템 호출이 실패합니다. 어떤 리소스를 사용할 수 없는지에 대한 다른 증거는 없습니다. 동시에 2개의 다른 xterm에서 내 프로그램을 실행하면 다른 숫자를 얻게 되지만 합산하면 하나의 xterm에서 실행하는 것과 같은 숫자가 됩니다. 나는 그것이 임의의 제한이 아니라 프로세스 테이블 항목, 스왑 또는 시스템 전체 리소스라고 가정합니다.

지금은 더 이상 시도할 것이 없습니다.

답변2

HP-UX의 한계가 무엇인지 모르겠습니다. 그러나 논리적 구현은 최대 크기의 프로세스 테이블을 갖는 것이라고 말씀드릴 수 있습니다. 이론적으로 프로세스 테이블 항목의 총 수는 프로세스 ID 범위에 따라 제한되지만 대부분의 구현에는 테이블 크기 제한이 있어 최대값이 더 작아집니다. 대부분의 Unix 변형에는 사용자당 프로세스 수에 제한이 있습니다. bash 에서 실행하면 제한을 확인할 수 있습니다 ulimit -u.

나는 UNIX 시스템이 프로세스 ID(실제 프로세스와 좀비 모두) 수에 대해 별도의 제한을 두는 대신 좀비에 대해 별도의 제한을 두는 것을 원하지 않습니다. 따라서 프로세스가 종료되어 좀비가 되어도 이는 제한에 영향을 주지 않습니다. 프로세스가 분기될 때 리소스(프로세스 테이블의 항목)가 할당되고 프로세스가 재활용될 때 해제됩니다.

답변3

프로세스 수가 무제한인 것처럼 좀비도 얼마든지 있을 수 있다고 생각했는데...?

좀비 프로세스는 궁극적으로 특수한 상태의 프로세스이며, 좀비 프로세스는 프로세스 테이블의 가용성과 크기에 따라 제한됩니다.정기적인프로세스.

분포마다 값이 다른가요?

물론 다른 매개변수도 많이 있습니다. 특정 크기나 많은 좀비 프로세스를 수용할 만큼 큰지 여부에 의존해서는 안 됩니다. 좀비가 너무 많으면 결국 꽉 차게 되므로 솔루션은 큰 테이블이 아닙니다. 좀비 프로세스 자체는 나쁘지 않지만 너무 많은 좀비 프로세스가 축적되면 좀비 프로세스를 허용하는 "잘못된 동작" 프로그램이 있음을 나타냅니다.

한계에 도달하여 또 다른 좀비를 생성하려고 하면 어떻게 되나요?

프로세스 테이블이 일반 프로세스와 좀비 프로세스로 가득 차면 시스템에 충분한 리소스(메모리, 프로세서 등)가 있더라도 새로운 일반 프로세스를 생성할 수 없습니다. 유일하게 누락된 리소스는 프로세스 테이블의 항목입니다. 이미 실행 중인 프로그램은 "잘 작동하는" 프로그램이라도 하위 프로세스를 생성해야 할 때 실패하기 시작합니다. 새 프로그램이 시작되지 않고 단일 명령 실행도 실패합니다.

관련 정보