O “ulimit -Su” limita o número de processos do usuário criados em subshells de login interativo e sessões tmux criadas nele?

4

Há alguns meses, escrevi um conjunto de scripts bash utilizando o tmux para criar um IDE simples em um servidor AIX 7.1. Há um bug em um dos meus scripts que às vezes gera processos do usuário muito rapidamente até o limite definido por ulimit. Isso acontece muito raramente (cerca de uma vez por mês), e já passei várias horas malsucedidas rastreando esse bug, então decidi que, por enquanto, eu poderia simplesmente definir meu limite de processo de usuário flexível para algo menor que o limite rígido ( por exemplo, 100 em vez de 1024) para que, quando meu bug se manifestar novamente, não ocorra um impacto perceptível no desempenho de outros usuários no servidor. Infelizmente, "ulimit -Su 100" não parece funcionar no bash no AIX 7.1, mas funciona em ksh. Eu executei a seguinte solução alternativa:

Tornou o ksh o shell padrão:

$ chsh [username] /usr/bin/ksh

Escrevi o seguinte para ~ / .kshrc:

ulimit -Su 100  # works in ksh, but not in bash
/bin/bash -il   # start bash as an interactive login shell
exit            # once bash exits, exit from ksh, too

Portanto, toda vez que eu criar um shell, o ksh definirá o limite do processo de usuário flexível e iniciará o bash como um shell de login interativo (ainda quero que o ~ / .bash_profile seja originado). Agora eu tenho que saber, os limites de processo do usuário definidos no ksh ainda serão aplicados em subshells do bash? No subshell de bash de nível superior, eu corri o seguinte:

$ ulimit -Sa
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 64
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited

Como você pode ver, o limite do processo do usuário está definido como 1024.

Outra grande preocupação é saber se o limite definido em ksh incluirá ou não processos criados em sessões tmux em sub-unidades bash.

outro detalhe: Sempre que eu crio um novo painel no tmux, tenho certeza de que o ksh é invocado, o ~ / .kshrc é originado e o bash é iniciado, assim como o normal. Eu acredito que este é o caso, porque o título de cada painel tmux recém-criado é "ksh" (o título padrão de um painel tmux é o nome do processo atual em primeiro plano), mas eu sou apresentado com um prompt bash em vez de um prompt do ksh.

Isso ficou um pouco demais, então suponho que omitirei mais detalhes a menos que seja solicitado.

Editar 1: comportamento estranho

Veja o que acontece quando tento obter o limite do processo do usuário com "ulimit -Su" (sem args), com e sem usar treliça:

$ truss ulimit -Su 2>| truss.out
100
$ ulimit -Su
1024

Talvez eu esteja usando a ferramenta errada, mas isso parece estranho. Esses comandos foram executados dentro do tmux.

Editar 2: informações adicionais

Estes comandos foram executados a partir de um prompt bash regular - sem subshells ou tmux.

$ truss ksh -c "ulimit -Su 100" 2>&1 | grep limit
getrlimit64(9, 0x2FF1B988)                      = 0
setrlimit64(9, 0x2FF1B988)                      = 0
$ truss bash -c "ulimit -Su 100" 2>&1 | grep limit
appulimit(1005, 0)                              = 0x2001C000
bash: line 0: ulimit: max user processes: cannot modify limit: A system call received a parameter that is not valid.
    
por Sam 11.12.2013 / 21:20

1 resposta

3

Introdução aos limites de recursos

Os limites de recursos em sistemas semelhantes a Unix são controlados por getrlimit() e setrlimit() chamadas do sistema. Esses limites são configurados por processo e são herdados quando um novo processo é gerado (por exemplo, por fork() ). Isso significa que se você quiser definir um limite a partir de um shell, o comando deve ser construído no shell (não executado como um processo filho). Realmente ulimit é embutido em muitos shells incluindo ksh e bash .

O comportamento observado

A natureza "incorporada" de ulimit explica o comportamento diferente em ksh e bash .

O limite para o número de processos do usuário ( ulimit -u ) é definido por setrlimit(RLIMIT_NPROC, ...) syscall. Em versões antigas do AIX, RLIMIT_NPROC não era suportado. < 1 > O suporte foi adicionado no AIX 6.1 < 2 seção 5.4.4 Implementou as alterações > para que o ulimit in ksh use setrlimit64() corretamente. O bash provavelmente foi compilado para ser compatível com a versão anterior do AIX e não é capaz de controlar esse limite.

Conclusão

Você pode usar o ulimit incorporado em ksh e todos os processos filhos herdarão os limites configurados. Os shells e processos em geral não têm nada a ver com a aplicação e manutenção dos limites de recursos, a menos que eles chamam explicitamente setrlimit() .

Alternativa

No AIX, há também uma alternativa que deve funcionar em versões mais antigas do AIX:

chdev -l sys0 -a maxuproc=100

Veja: 3 , 4

    
por 12.12.2013 / 20:22