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
rubo77
fonte
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.

pabouk
fonte
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.

Michael
fonte