Entendendo ulimit -u

4

Eu gostaria de entender o que está acontecendo aqui.

linvx$ ( ulimit -u 123; /bin/echo nst )
nst

linvx$ ( ulimit -u 122; /bin/echo nst )
-bash: fork: Resource temporarily unavailable
Terminated

linvx$ ( ulimit -u 123; /bin/echo one; /bin/echo two; /bin/echo three )
one
two
three

linvx$ ( ulimit -u 123; /bin/echo one & /bin/echo two & /bin/echo three )
-bash: fork: Resource temporarily unavailable
Terminated
one

Eu especulo que os primeiros 122 processos são consumidos pelo próprio Bash, e que o% restanteulimit rege quantos processos concorrentes eu tenho permissão para ter. A documentação não é muito clara sobre isso. Estou faltando alguma coisa?

Mais importante, para uma implantação no mundo real, como posso saber que tipo de ulimit é realista? É um daemon de longa duração que gera threads de trabalho sob demanda e as colhe quando a carga diminui. Eu fiz girar o servidor até a morte algumas vezes. O limite mais importante é provavelmente a memória, que agora limito a 200 milhões por processo, mas gostaria de descobrir como posso impor um limite no número de crianças (o programa me permite configurar um máximo, mas como eu sei que não há erros nessa parte do código?)

Adendo: em um sistema mais recente, obtenho um número maior e um comportamento ligeiramente diferente.

xubuntu12.04$ ( ulimit -u 206; /bin/echo nst )
nst

xubuntu12.04$ ( ulimit -u 205; /bin/echo nst )
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
Terminated

xubuntu12.04$ bash --version
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

O sistema mais antigo tinha o Bash v3, acredito.

Em dash , obtenho um comportamento diferente, embora ainda não seja o comportamento esperado (e a opção é denominada -p em vez de -u ):

xubuntu12.04$ dash

$ ( ulimit -p 1; /bin/echo nst )
nst

$ ( ulimit -p 2; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork

$ ( ulimit -p 208; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork
nst

$ ( ulimit -p 209; /bin/echo nst & /bin/echo too & )
nst
too
    
por tripleee 16.11.2012 / 11:52

2 respostas

6

Não são apenas os subprocessos no subshell que contam contra o limite, mas tudo no sistema sob o seu uid.

Assim, se você tem 200 processos sendo executados como você em qualquer lugar do sistema, um processo com ulimit -u 205 só será capaz de bifurcar até que a contagem total atinja 205 - isto é, cinco vezes (se nada sair). / p>     

por 20.04.2013 / 16:33
2

É assim que o ulimit funciona.

Se você deseja permitir a um usuário 4 processos em execução,

você teria 1 + 4 (um é para o processo bash que o usuário está usando no momento)

Dos meus testes,

criou um teste de usuário,

ran ulimit -u 1

não pôde executar nenhum comando como bash, já sendo um processo em execução,

ran ulimit -u 2

só pode executar um processo, por exemplo,

ps aux -> returned value but ps aux | grep test -> did not return as it's using 2 processes

Por fim, o uso do ulimit na sua conta root não é recomendado, o ulimit é usado principalmente para grandes ambientes multiusuário.

Espero que isso ajude!

Felicidades,

===============

 -a     All current limits are reported
 -b     The maximum socket buffer size
 -c     The maximum size of core files created
 -d     The maximum size of a process’s data segment
 -e     The maximum scheduling priority ("nice")
 -f     The maximum size of files written by the shell and its children
 -i     The maximum number of pending signals
 -l     The maximum size that may be locked into memory
 -m     The maximum resident set size (many systems do not honor this limit)
 -n     The maximum number of open file descriptors (most systems do not allow  this
                     value to be set)
 -p     The pipe size in 512-byte blocks (this may not be set)
 -q     The maximum number of bytes in POSIX message queues
 -r     The maximum real-time scheduling priority
 -s     The maximum stack size
 -t     The maximum amount of cpu time in seconds
 -u     The maximum number of processes available to a single user
 -v     The maximum amount of virtual memory available to the shell
 -x     The maximum number of file locks
 -T     The maximum number of threads
    
por 22.01.2013 / 13:14