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.

Andrew Grimm
fonte
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
Relacionado: Ubuntu - muitos arquivos abertos?
kenorb 03/02

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
Andrea Olivato
fonte
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?

Kervin
fonte
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