당신이 가질 수있는 좀비 프로세스의 수에 대한 상한이 있습니까?


17

나는 HP-UX 시스템에서 일 했었고 이전 관리자는 시스템에서 가질 수있는 좀비 프로세스의 수에 상한이 있다고 1024를 믿습니다.

  • 이것은 어려운 사실 한도입니까? 많은 프로세스를 가질 수있는 것처럼 좀비를 가질 수 있다고 생각합니다 ...?
  • 배포판에서 배포판으로 다른 값입니까?
  • 상한에 도달하고 다른 좀비를 만들려고하면 어떻게됩니까?

1
이 블로그 기사 에 따르면 Linux에서 유일하게 제한되는 것은 PID 수이며 우연히 좀비에만 영향을 미칩니다.
bahamat

2
아래의 두 답변은 모두 언급 ulimit -u합니다. 나에 대한 man ulimit언급이없는 C 루틴을 얻었으므로 잠시 혼란 스러웠다 -u. 언급 된 ulimit는 실제로 내장 된 bash 도구이며 bash 맨 페이지에 설명되어 있습니다.
Emanuel Berg

답변:


11

나는 HP-UX를 사용할 수 없으며, 큰 HP-UX 팬이었던 적이 없다.

Linux에서는 프로세스 당 또는 사용자 당 자식 프로세스 수에 대한 제한이있는 것으로 보입니다. limitZsh 내장으로 볼 수 있습니다 ( ulimit -ubash에서와 비슷한 것으로 보입니다 ).

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

아치 리눅스 노트북에 있습니다.

그 한계를 테스트하는 작은 프로그램을 작성했습니다.

#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 신호의 수는 분기 된 자식 프로세스 수와 동일하지 않습니다. 나는 리눅스 커널이 때때로 종료 된 자식 프로세스 수에 대해 1 개의 SIGCHLD를 보냅니다.

어쨌든 내 아치 리눅스 랩톱에서 16088 개의 자식 프로세스가 분기되며 프로그램이 wait(2)신호 처리기에서 시스템 호출을 수행하지 않기 때문에 좀비 수 여야 합니다.

내 Slackware 12 서버에서의 값과 거의 일치하는 6076 개의 자식 프로세스를 얻습니다 maxproc 6079. 내 사용자 ID에는 2 개의 다른 프로세스가 실행 중이며 sshdZsh가 있습니다. 위의 프로그램의 첫 번째, 좀비가 아닌 인스턴스와 함께 6079를 만듭니다.

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

지금 시도해 볼만한 것이 없습니다.


4

HP-UX의 한계가 무엇인지 모르겠습니다. 그러나 논리적 구현에는 최대 크기의 프로세스 테이블이 있어야한다고 말할 수 있습니다. 프로세스 테이블 항목의 총 수는 이론적으로 프로세스 ID의 범위에 의해 제한되지만 대부분의 구현에는 테이블에 대한 크기 제한이있어 최대 값이 훨씬 작습니다. 대부분의 유닉스 변형에는 프로세스 수에 대한 사용자 당 제한이 있습니다. ulimit -ubash에서 실행하면 한계를 볼 수 있습니다 .

유닉스 시스템이 프로세스 ID 수 (좀비뿐만 아니라 실제 프로세스 포함)보다 좀비에 대해 별도의 제한이 있다고는 생각하지 않습니다. 따라서 프로세스가 종료되고 좀비가되면 한계에 영향을 미치지 않습니다. 프로세스 (포스트 프로세스 테이블의 항목)는 프로세스가 분기 될 때 할당되고 프로세스가 회수 될 때 해제됩니다.


2

많은 프로세스를 가질 수있는 것처럼 좀비를 가질 수 있다고 생각합니다 ...?

좀비 프로세스는 마침내 특정 상태의 프로세스이며, 좀비 프로세스는 일반 프로세스 와 마찬가지로 프로세스 테이블의 가용성과 크기로 제한 됩니다.

배포판에서 배포판으로 다른 값입니까?

다른 많은 매개 변수와 마찬가지로 특정 크기로 또는 많은 좀비 프로세스를 수용 할 수있을 정도로 큰 경우 릴레이해서는 안됩니다. 너무 많은 좀비를 얻는다면 솔루션은 결국 가득 찼기 때문에 큰 테이블이 아닙니다. 좀비 프로세스 자체는 나쁘지 않지만 누적 된 좀비 프로세스가 너무 많으면 좀비 프로세스가 허용되는 "나쁜 동작"프로그램을 나타냅니다.

상한에 도달하고 다른 좀비를 만들려고하면 어떻게됩니까?

프로세스 테이블이 정규 및 좀비 프로세스로 가득 차면 시스템에 메모리, 프로세서 등의 리소스가 충분한 경우에도 새로운 정규 프로세스를 만들 수 없습니다. 유일하게 부족한 리소스는 프로세스 테이블의 단일 항목입니다. 하위 프로세스를 작성해야 할 때 이미 실행중인 프로그램 (예 : "잘 작동")도 실패하기 시작합니다. 새 프로그램을 시작할 수 없으며 단일 명령을 실행해도 실패합니다.


Even running single commands would fail.-> 그것은 큰 영향입니다.
Shiplu Mokaddim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.