Como contornar “Muitos arquivos abertos” no debian


8

Se eu quiser ver todos os arquivos de log relevantes do meu servidor apache2 de uma só vez, eu uso

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Mas como esses arquivos são muitos agora, gostaria de aumentar esse limite.

Como posso aumentá-lo para uma sessão ssh? E como eu poderia aumentá-lo globalmente em todo o sistema?

Eu posso ver que o limite de arquivos abertos é 1024 na minha máquina:

ulimit -n
1024

Exceder o limite do arquivo geralmente é um sinal de um problema. Como já observado, você pode ter um problema com a rotação do log. (O log girado pode deixar o seu comando.) Fora de / var / log / apache2, não deve haver muitos (nenhum) logs relacionados ao seu servidor Apache. Com base no seu padrão grep, você provavelmente deseja restringir seu acesso aos logs de acesso.
— BillThor

obrigado pela dica, mas meu logrotaion funciona bem. Eu tenho tantos registros, porque todos os 1025 domínios no meu servidor tem seu próprio arquivo de log;)
— rubo77

1
Seus padrões parecem também capturar registros de erros e registros de acesso. Esse deve ser um problema menor se você tiver um único log de erros. Se você deixar isso em execução em um shell, convém usar, em -Fvez de, -fpara que os logs sejam reabertos quando rotacionados.
— BillThor

Respostas:


15

É importante saber que existem dois tipos de limites:

  • Um limite fixo é configurável apenas pela raiz. Este é o valor mais alto possível (limite) para o limite flexível.
  • Um limite flexível pode ser definido por um usuário comum. Este é o limite real em vigor.

Solução para uma única sessão

No shell, defina o limite flexível:

ulimit -Sn 2048

Este exemplo aumentará o limite real para 2048, mas o comando será bem-sucedido apenas se o limite máximo (verificação ulimit -Hn:) for igual ou superior. Se você precisar de valores mais altos, aumente o limite rígido usando um dos métodos abaixo. Os limites são definidos por processo e são herdados por processos gerados recentemente; portanto, qualquer coisa que você execute após esse comando no mesmo shell terá os novos limites.

Alterando o limite rígido em uma única sessão

Isso não é fácil porque apenas o root pode alterar um limite rígido e, depois de mudar para o root, você precisa voltar ao usuário original. Aqui está a solução com sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Solução para todo o sistema

No Debian e em muitos outros sistemas que pam_limitsvocê usa, você pode definir os limites de todo o sistema /etc/security/limits.confnos arquivos /etc/security/limits.d. O arquivo conf contém uma descrição. Linhas de exemplo:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Isso definirá o limite máximo e o limite flexível padrão para usuários do grupo webadminsapós o login.

Outros limites

O valor do limite rígido é limitado pelo limite global do valor dos descritores de arquivo aberto, no /proc/sys/fs/file-maxqual é bastante alto por padrão nas distribuições modernas do Linux. Este valor é limitado pelo NR_OPENvalor usado durante a compilação do kernel.

Não existe uma solução melhor?

Talvez você possa verificar se todos os *logarquivos que você alimenta tail -fsão realmente arquivos ativos que precisam ser monitorados. É possível que alguns deles já estejam fechados para registro e você pode simplesmente abrir um número menor de arquivos.


ulimit -sN 4096 -bash: ulimit: aberto arquivos: Kann die Grenze nicht ändern: Das ist Argumento ungültig - significa o argumento não é válido
— rubo77

@ rubo77: adicionei informações sobre o limite rígido, que provavelmente é a causa do problema.
— precisa saber é

@ rubo77: Também é possível definir o limite rígido em uma sessão de shell, mas é complicado porque você tem que sua raiz e suvolta para o usuário:su -c "ulimit -Hn 6000 ; su $USER"
— pabouk

OK, então para uma mudança temporária do limite Vou usar ulimit -Hn 6000; ulimit -Sn 6000como root, então
— rubo77

1
@amenthes Acho que você quer dizer os arquivos de configuração /etc/limits.*. Esses limites são aplicados sempre que o módulo PAM pam_limits.soé chamado. Normalmente, é no início de uma sessão. Por exemplo, no Ubuntu 14.04 é nestas ferramentas / comandos: cron, login(texto de login console), lightdm(o login GUI), su. Você pode definir onde é pam_limitsusado /etc/pam.*. Veja por exemplo: faqs.org/docs/securing/chap5sec44.html
— pabouk

0

Eu tive o aviso PHP no meu error.log do Apache:

failed to open stream: Too many open files in ...

Então eu descobri que o apache define esse valor individualmente ao iniciar (no meu Ubuntu 14.04). Está configurado em /etc/apache2/envvars. Diz:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

então eu tive que ajustar a terceira linha.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.