Administrar servidores Unix pode ser um desafio, especialmente quando os sistemas que você gerencia são muito utilizados e os problemas de desempenho reduzem a disponibilidade. Felizmente, você pode colocar limites em certos recursos para ajudar a garantir que os processos mais importantes em seus servidores possam continuar rodando e processos concorrentes não consumam muito mais recursos do que é bom para o sistema como um todo. O comando ulimit pode manter o desastre à distância, mas você precisa antecipar onde limites farão sentido e onde eles causarão problemas.
Pode não acontecer com tanta freqüência, mas um único usuário que inicia muitos processos pode tornar um sistema inutilizável para todos os outros. Uma bomba de garfo — um ataque de negação de serviço no qual um processo se replica continuamente até que os recursos disponíveis se esgotem — é o pior caso disso. No entanto, mesmo usuários amigáveis podem usar mais recursos do que é bom para um sistema — muitas vezes sem intenção. Ao mesmo tempo, processos legítimos podem, às vezes, falhar quando são executados contra limites que são projetados para usuários médios. Neste caso, você precisa se certificar de que esses processos sejam alocados com mais recursos do sistema que permitam que eles rodem corretamente sem disponibilizar os mesmos recursos para todos.
Para ver os limites associados ao seu login, use o comando ulimit -a. Se você estiver usando uma conta de usuário regular, você provavelmente verá algo como isto:
$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 32767max locked memory (kbytes, -l) 32max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 50virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
Uma coisa que você pode notar logo de cara é que você não pode criar core dumps — porque o tamanho máximo do seu arquivo de core é 0. Sim, isso significa nada, sem dados, sem core dump. Se um processo que você está executando abortar, nenhum arquivo core será descartado em seu diretório home. Desde que o tamanho do arquivo de núcleo esteja configurado para zero, não são permitidos core dumps. Isto faz sentido para a maioria dos usuários já que eles provavelmente não fariam mais nada com um core dump além de apagá-lo, mas se você precisa de um core dump para depurar problemas que você está enfrentando com uma aplicação, você pode querer definir o tamanho do seu arquivo de núcleo para ilimitado — e talvez você possa.
$ ulimit -c ulimited$ ulimit -cunlimited
Se você está gerenciando um servidor e quer ativar a capacidade de gerar core dumps para todos os seus usuários — talvez eles sejam desenvolvedores realmente precisam ser capazes de analisar esses core dumps, você tem que mudar o usuário para root e editar seu /etc/security/limits.conf (Linux) ou fazer alterações em seu arquivo /etc/system (Solaris).
Se, por outro lado, você está gerenciando um servidor e não quer que nenhum de seus usuários seja capaz de gerar despejos de núcleo independentemente do quanto eles gostariam de afundar seus dentes em um, você pode definir um limite de 0 em seus limites.conf.
Um outro limite que é frequentemente imposto é aquele que limita o número de processos que um indivíduo pode executar. A opção ulimit usada para isso é -u. Você pode olhar seu limite como fizemos acima com o comando ulimit -a ou mostrar apenas o limite “nproc” com o comando ulimit -u.
$ ulimit -u50
Once novamente, seus usuários podem alterar seus limites com outro comando ulimit — ulimit -u 100 — a menos, é claro, que eles não possam. Se você os limitou a 50 processos no arquivo limit.conf ou do sistema, eles receberão um erro como este quando tentarem aumentar seus limites:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
Limits também podem ser configurados por grupo para que você possa, digamos, dar aos desenvolvedores a capacidade de executar mais processos do que gerentes. Linhas como estas no seu arquivo limit.conf fariam isso:
@managers hard nproc 50@developers hard nproc 200
Se você quiser limitar o número de arquivos abertos, basta usar uma configuração diferente.
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Aqui nós demos dois grupos e um aumento individual nos seus limites de arquivos abertos. Todos eles estabelecem limites rígidos. Se você definir limites suaves também, os usuários receberão avisos quando atingirem o limite inferior.
@developers soft nofile 2048@developers hard nofile 8192
Para ver uma lista das opções de ulimit, olhe a página man (man ulimit). Você notará que ulimit é um bash embutido — pelo menos no Linux — e que as seguintes opções estão disponíveis:
-a All current limits are reported-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 (has no effect on Linux)-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
Se você permitir o arquivo limit.conf, você poderá ver limites como estes configurados para aplicações particulares que realmente precisam da capacidade extra. Neste exemplo, o usuário do oracle está tendo a capacidade de executar até 16.384 processos e abrir 65.536 arquivos. Estas linhas seriam configuradas no arquivo .bash_profile.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi
do usuário do oracle.