Muitos arquivos abertos - como encontrar o culpado


69

Ao executar tail -f filename, recebi a seguinte mensagem:

tail: inotify cannot be used, reverting to polling: Too many open files

Isso é um problema em potencial?

Como diagnosticar o que é responsável por todos os arquivos abertos? Eu tenho uma lista de processos suspeitos, mas se eles não forem os culpados, instruções que não dependem de saber qual processo verificar serão úteis.


11
Você aumentou o número de descritores de arquivos disponíveis via ulimit?
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams Isso pode ser útil para outros usuários, mas para mim seria mais o tratamento do sintoma do que da doença.
Andrew Grimm

Enquanto você não está errado, às vezes os aplicativos têm razões legítimas para ter muitos arquivos abertos.
Ignacio Vazquez-Abrams

Respostas:


72

Você pode usar lsof para entender quem está abrindo tantos arquivos. Geralmente é um servidor (web) que abre muitos arquivos, mas lsof certamente ajudará a identificar a causa.

Depois de entender quem é o bandido, você pode

Se a saída de lsof for enorme, tente redirecioná-la para um arquivo e abra o arquivo

Exemplo (talvez você precise Ctrl+ Co primeiro comando)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

37
Para os preguiçosos:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itsadok

11
Eu recebi o mesmo erro e o uso do ulimit não funciona. O comando -F da cauda ainda retorna o erro. Aumentei o limite de 1024 para 3000 para imaginar que já tinha espaço suficiente ... Acho que teria que reiniciar!
Alexis Wilke

15
Achei a linha do itsadok útil, mas acho que você deve classificar primeiro (porque uniqsó funciona com linhas adjacentes), executar o uniq e classificar novamente. Então lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier

19
Classificar e contar o maior número de arquivos abertos é definitivamente a melhor coisa a fazer. Mostrar nome do processo e pid: '' 'lsof | awk '{print $ 2 "" $ 1; } '| classificar -rn | uniq -c | classificar -rn | cabeça -20 '''
gaoithe

2
@gaoithe se você colocar isso em uma resposta terei prazer upvote-lo:)
Matt Bola

23

Caso mais alguém precise ...

ulimit -a

Exibe todos os limites atuais. Especificamente ulimit -n 70000, definirá o limite do descritor de arquivo.

Além disso...

cat /proc/sys/fs/file-max

Irá exibir / definir o limite do kernel, se editado.

sudo echo 200000 > /proc/sys/fs/file-max

Uma explicação muito mais detalhada pode ser encontrada em ...

Como aumentar o limite de arquivos abertos para um usuário não root?


3
existem limites para que você possa manter controle rígido sobre o uso de recursos em seu sistema. É melhor aumentá-los individualmente para processos que você sabe que precisarão usar muitos descritores de arquivos. Ao mantê-los rígidos nos testes, você encontrará processos que podem vazar constantemente os descritores de arquivos ao longo do tempo. Observe também que os identificadores de arquivo são usados ​​para qualquer acesso ao dispositivo no unix / linux. por exemplo, cada soquete de rede aberto por um processo usa um identificador de arquivo. Isso explica por que você pode acessar os "muitos arquivos abertos" no caso de arquivos regulares do sistema de arquivos, bem como de arquivos de dispositivos, como conexões de rede.
gaoithe
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.