RLIMIT_NPROC de repente sobrecarregado

6

Em um pequeno script que eu tenho, eu estou começando um shell e, em seguida, configurando RLIMIT_NPROC nele para um pequeno número, como 5, usando prlimit

Depois, tento executar um script de shell que contém apenas:

#!/bin/bash
echo hi
sleep 3

enviando "./test.sh\n" através de stdin e aguardando o resultado. Ao mesmo tempo, estou usando ps --ppid <somepid> -o pid= para listar os PIDs filhos do primeiro.

Isso sempre falha com o erro bash: fork: retry: No child processes . Eu tentei definir o limite para RLIM_INFINITY para ver quantos processos filho são criados, mas apenas um é listado (naturalmente o shell test.sh).

Como posso limitar adequadamente o número de processos filhos (ou, mais geralmente, restringir algum tipo de fork fork)? Eu sei sobre cgroups e outras alternativas similares, mas estou tentando escrever isso para aprender, e esse comportamento realmente me confunde.

Eu acho que pode ser devido a documentação do RLIMIT_NPROC informando que ele limita "O número máximo de processos (ou, mais precisamente no Linux, threads)" e um grande número de threads sendo criados, mas o programa só funciona quando eu aumento RLIMIT_NPROC até 500 ou mais, e isso não parece muito razoável.

Se esse comportamento for inesperado, pode ser um erro de codificação. Nesse caso, tentarei limpar o código de teste para postar aqui.

    
por Jonathan Chan 26.12.2012 / 23:02

2 respostas

3

RLIMIT_NPROC não controla o número de filhos que um processo pode ter.

Controla o número total de processos que o usuário pode ter. Mais especificamente, como é uma configuração por processo, quando fork (), clone (), vfork (), etc é chamado por um processo, o valor RLIMIT_NPROC para esse processo é comparado ao processo total conte para o pai usuário do processo , não para o número de filhos que o processo possui.

    
por 11.02.2013 / 10:11
1

Eu entendo a man page de getrlimit(2) dizendo que ela limita o número de threads (não relevante aqui) que pode ser executado como usuário real.

Eu não tenho certeza se entendi o que você está fazendo, então fique comigo. Você inicia um programa que leva o script listado e o executa como filho. Enquanto isso, você executa ps para verificar os PIDs?

O shell que o usuário está executando é certamente um, o programa inicia o script em outro, depois há o script sendo executado e o ps faz 5. Se agora o ps tentar iniciar um thread para seus propósitos internos, ele falhará devido a até o limite de 5 processos.

O que você descreve parece algum tipo de experiência para ver como fazer algo. Que problema você está realmente tentando resolver? Sem saber o que é isso, não há como sugerir alternativas melhores (ou dizer como fazer o que você quer).

    
por 24.01.2013 / 18:03

Tags