Páginas

quarta-feira, 9 de março de 2011

Aumentando o limite de File Descriptors

Fala pessoal...

Recentemente precisei aumentar o número de arquivos abertos (open files) de uma máquina Debian, porém ao editar o arquivo /etc/security/limits.conf, os valores não eram alterados, mesmo depois de reiniciar. Essa dica, funciona nas versões 5 e 6 do Debian.

Para verificar qual é o valor máximo de open files, utiliza-se o comando ulimit -a (todas as informações) ou o comando ulimit -n (somente o valor de open files). A saída do ulimit -a de um sistema padrão é assim:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Essa opção nos mostra qual é o máximo de arquivos abertos simultaneamente.


1024 arquivos simultâneos não é suficiente?
Depende, imagine um servidor web com mais de 1024 acessos simultâneos, para cada conexão efetuada, 1 File Descriptor é alocado, e esse limite é atingido rapidamente, e a máquina começa com muitos sintomas estranhos.....

Beleza, partindo desse ponto, fica fácil, é só ir no /etc/security/limits.conf e adicionar a opção nofile dessa forma:
* soft nofile 16384
* hard nofile 32768
Onde:

* = Todos os usuários
soft = limite padrão
hard = limite máximo
16386/32768 = valores do File Descriptors

E qual o problema?
Quando o o arquivo era alterado, serviços eram iniciados com o valor padrão de File Descriptors (1024)

Solução:

o arquivo /etc/pam.d/common-account é o arquivo responsável pelas configurações de login de todos os serviços.
No final do arquivo insira:

session required pam_limits.so
 Basta um restart na máquina para que essa solução funcione.

Uma coisa que notei foi: o usuário root não entrava nas regras do limit, ficava no padrão, a solução foi adicionar o usuário root no limits.conf como no exemplo abaixo:

root soft nofile 16384
root hard nofile 32768
* soft nofile 16384
* hard nofile 32768

É isso, qualquer coisa enviem um e-mail:

2 comentários:

  1. Muito obrigado cara, estava precisando muito disso... Procurei em vários lugares, porém nenhum não simples e objetivo quanto o seu.

    Estou com problemas em um cliente da cidade que tem um fluxo enorme no site, e o limite de 1024 estava acabando com meus cabelos! Graças a você consegui resolver.

    Só uma dúvida, a questão de max memoria alocada, é necessário alterar ela também? Pois o valor padráo é 32 Kbytes, não é pouco?

    felipe@linuxrs.com.br

    ResponderExcluir
  2. Dica muito boa, estou tendo dificuldades com uma aplicação em vários clientes e esta dica foi minha salvação.
    Agora me surgiu um problema, em um dos meus clientes eu fiz exatamente como da forma descrita acima e funcionou após o reboot da maquina com o ulimit -n estava lá o limite que eu escolhi. Mas após um mês o problema com minha aplicação voltou a dar problema quando dei novamente o comando ulimit -n o limit estava em 1024 revisei todos os passos e estava tudo correto reiniciei a maquina algumas vezes mas não adiantou o limit continua em 1024.
    Alguma ideia do que possa ser?

    wmazuchi@gmail.com

    ResponderExcluir