Existe um limite máximo para o número de processos zumbis que você pode ter?

17

Eu costumava trabalhar com um sistema HP-UX e o antigo administrador me disse que há um limite superior no número de processos zumbis que você pode ter no sistema, acredito que 1024.

  • Este é um teto de fato difícil? Eu acho que você poderia ter qualquer número de zumbis, como se você pudesse ter qualquer número de processos ...?
  • O valor da distro para a distro é diferente?
  • O que ocorre se atingirmos o limite superior e tentarmos criar outro zumbi?
por ProfessionalAmateur 27.07.2012 / 23:11

3 respostas

11

Eu não tenho o HP-UX disponível para mim e nunca fui um grande fã do HP-UX.

Parece que no Linux, um limite por processo ou talvez por usuário limita a quantidade de processos filhos existentes. Você pode vê-lo com o limit Zsh embutido (parece ser análogo a ulimit -u no bash):

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

Isso está em um laptop Arch linux.

Eu escrevi um pequeno programa para testar esse limite:

#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;
}

Foi surpreendentemente difícil "coletar" todos os zumbis chamando wait(2) o suficiente. Além disso, o número de sinais SIGCHLD recebidos nunca é o mesmo que o número de processos filho bifurcados: Acredito que o kernel do linux envie às vezes 1 SIGCHLD para um número de processos filhos que saíram.

De qualquer forma, no meu laptop Arch linux, recebo 16088 processos filho bifurcados, e esse tem que ser o número de zumbis, já que o programa não faz wait(2) chamadas de sistema no manipulador de sinal.

No meu servidor Slackware 12, recebo 6076 processos-filhos, o que corresponde ao valor de maxproc 6079 . Minhas  O ID do usuário possui 2 outros processos em execução, sshd e Zsh. Juntamente com a primeira instância não-zumbi do programa acima que faz 6079.

A chamada do sistema fork(2) falha com um erro "Recurso temporariamente indisponível". Não vejo nenhuma outra evidência de qual recurso está indisponível. Eu obtenho números um pouco diferentes se eu executo meu programa simultaneamente em 2 xterms diferentes, mas eles somam o mesmo número que se eu o executasse em um xterm. Eu suponho que seja entradas de tabela de processo, ou swap ou algum recurso de todo o sistema, e não apenas um limite arbitrário.

Eu não tenho mais nada para testar agora.

    
por 28.07.2012 / 08:13
4

Não sei quais são os limites do HP-UX. No entanto, posso dizer que a implementação lógica é ter uma tabela de processos com um tamanho máximo. O número total de entradas da tabela de processos é teoricamente limitado pelo intervalo de IDs do processo, mas a maioria das implementações tem um limite de tamanho para a tabela que produz um máximo muito menor. A maioria das variantes unix tem um limite por usuário no número de processos também; você pode ver o limite executando ulimit -u no bash.

Eu não espero que um sistema unix tenha um limite separado para zumbis, ao invés do número de IDs de processo (que inclui processos reais e zumbis). Assim, quando um processo morre e se torna um zumbi, isso não afeta o limite: o recurso (a entrada na tabela de processos) é alocado quando um processo é forjado e liberado quando o processo é obtido.

    
por 30.07.2012 / 02:40
2

Eu acho que você poderia ter qualquer número de zumbis, como se você pudesse ter qualquer número de processos ...?

Um processo zumbi é finalmente um processo - em um estado especial - então os processos zumbis são limitados à disponibilidade e ao tamanho da tabela de processos, como em processos regulares .

O valor diferente da distro é distribuído?

Certamente, como muitos outros parâmetros. Você não deve transmitir em um tamanho específico, ou se ele é grande o suficiente para conter muitos processos de zumbis. Se você está recebendo muitos zumbis, a solução não é uma grande mesa, porque ela acabará ficando cheia. Um processo zumbi não é ruim por si só, mas ter muitos processos zumbis acumulados é uma indicação de um programa "mal-comportado" que permite processos zumbis.

O que ocorre se atingirmos o limite superior e tentarmos criar outro zumbi?

Quando a tabela de processos estiver cheia - de processos regulares e zumbis -, nenhum processo novo-regular pode ser criado, mesmo que o sistema tenha recursos suficientes - memória, processador, etc.-. O único recurso que falta é apenas uma entrada na tabela de processos. Os programas em execução - mesmo os "bem comportados" - começarão a falhar quando precisarem criar um subprocesso. Novos programas não puderam ser iniciados e até mesmo a execução de comandos únicos falharia.

    
por 31.05.2015 / 07:12
Parada interrompida de um diretório? ______ qstntxt ___

Eu tenho uma configuração interessante: um servidor com vários servidores NFS remotos montados em uma pasta, com essa pasta sendo exportada novamente pelo Samba. Pense nisso como um proxy de compartilhamento, mantendo todas as pastas compartilhadas em um só lugar.

Meu problema é que sempre que uma das montagens é desativada (servidor reiniciado, serviço reiniciado, disco rígido externo que o servidor estava exportando foi removido, etc.), qualquer tentativa de ler os blocos de montagem para sempre. Isso também significa que a execução de %code% nesse diretório congela e os usuários que se conectam pelo Samba também congelam. Isso também causou algumas vezes um dos meus trabalhos cron para bloquear o que quase caiu no servidor porque tinha centenas de processos bloqueados. Isso está ficando muito chato, já que eu geralmente tenho que abrir um terminal que não está esperando o %code% terminar (não posso cancelá-lo), execute %code% , espero que ele funcione, corrija o problema, remonte tudo .

Existe uma maneira de montar um compartilhamento NFS com a condição de que, se a conexão falhar por qualquer motivo (de preferência com um período de repetição), a montagem não é montada ou, pelo menos, não é bloqueada?

    
______ azszpr31981 ___

Normalmente, quando montar o NFS, é uma boa idéia ter um conjunto de sinalizadores semelhante a este:

%pre% %bl0ck_qu0te%

Você também pode definir:

%pre%

que deve permitir que a montagem NFS atinja o tempo limite e torne o diretório inacessível se o servidor NFS interromper a conexão, em vez de esperar em novas tentativas.

Dê uma olhada no este link para mais informações sobre as opções de montagem do NFS

    
___ Encontre o proprietário do ponteiro do X.org