Após uma atualização recente para o Fedora 15, estou descobrindo que várias ferramentas estão falhando com erros nas seguintes linhas:
tail: inotify resources exhausted
tail: inotify cannot be used, reverting to polling
Também não tail
está relatando problemas com o inotify. Existe alguma maneira de interrogar o kernel para descobrir qual processo ou processos estão consumindo os recursos de inotificação? As sysctl
configurações atuais relacionadas ao inotify ficam assim:
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.inotify.max_queued_events = 16384
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -exec sh -c 'cat $(dirname {})/../cmdline; echo ""' \; 2>/dev/null
Provavelmente você está ficando sem relógios inotify em vez de instâncias. Para descobrir quem está criando muitos relógios:
echo 1 >> /sys/kernel/debug/tracing/events/syscalls/sys_exit_inotify_add_watch/enable
para ativar o rastreamento de adições de relógios;cat /sys/kernel/debug/tracing/tracing_enabled
para garantir que esteja definido como 1 e, se não estiver, façaecho 1 >> /sys/kernel/debug/tracing/tracing_enabled
;/sys/kernel/debug/tracing/trace
para ver quantos relógios são criados e por quais processos.Quando terminar, certifique-se de ecoar 0 no arquivo de habilitação (e o arquivo tracing_enabled, se você também tiver que habilitá-lo) para desativar o rastreio, para que você não sofra o impacto no desempenho de continuar rastreando.
fonte
echo 1 | sudo tee /sys/kernel/debug/tracing/tracing_on
as distribuições modernas (Ubuntu 18.04.2 LTS).Como disse Jonathan Kamens, você provavelmente está ficando sem relógios. Eu tenho um script de premade ,
inotify-consumers
, que as listas isso para você:Aqui você vê rapidamente por que o limite padrão de observadores de 8K é muito pequeno em uma máquina de desenvolvimento, pois apenas a instância do WebStorm o maximiza rapidamente ao encontrar uma
node_modules
pasta com milhares de pastas. Adicione um observador de webpack para garantir problemas ...Basta copiar o conteúdo do script (ou o arquivo no GitHub) e colocá-lo em algum lugar do seu
$PATH
, como/usr/local/bin
. Para referência, o conteúdo principal do script é simplesmente esteCaso você esteja se perguntando como aumentar os limites, veja como torná-lo permanente:
fonte
Encontrei esse problema e nenhuma dessas respostas fornece a resposta "quantos relógios cada processo está usando atualmente?" Todos os itens de uma linha fornecem quantas instâncias estão abertas, o que é apenas parte da história, e o material de rastreamento é útil apenas para ver novos relógios sendo abertos.
TL; DR: você receberá um arquivo com uma lista de
inotify
instâncias abertas e o número de relógios que eles têm, juntamente com os pids e binários que os geraram, classificados em ordem decrescente pela contagem de visualizações:É uma grande bagunça, então aqui está como cheguei lá. Para começar, eu corri um
tail
arquivo de teste e observei os arquivos abertos:Então, 4 é o valor que queremos investigar. Vamos ver o que há
fdinfo
para isso:Parece uma entrada para o relógio na parte inferior!
Vamos tentar algo com mais relógios, desta vez com o
inotifywait
utilitário, apenas observando o que estiver em/tmp
:Aha! Mais entradas! Portanto, devemos ter seis coisas
/tmp
:Excelente. Meu novo
inotifywait
tem uma entrada em suafd
lista (que é o que os outros itens aqui estão contando), mas seis entradas em seufdinfo
arquivo. Assim, podemos descobrir quantos relógios um determinado fd para um determinado processo está usando consultando seufdinfo
arquivo. Agora, junte-o a algumas das opções acima para obter uma lista de processos que notificaram a abertura de relógios e use isso para contar as entradas em cada umfdinfo
. Isso é semelhante ao acima, então eu vou despejar o one-liner aqui:Há algumas coisas grossas aqui, mas o básico é que eu uso
awk
para criar umfdinfo
caminho a partir dalsof
saída, pegando o número pid e fd, retirando a bandeira u / r / w do último. Então, para cadafdinfo
caminho construído , conto o número deinotify
linhas e produzo a contagem e o pid.Seria bom se eu tivesse quais processos esses pids representam no mesmo lugar, certo? Eu pensei assim. Assim, em um pouco particularmente confuso, eu estabeleci-me em chamar
dirname
duas vezes nofdinfo
caminho para chegar pack para/proc/<pid>
, adicionando/exe
a ele, e depois correndoreadlink
em que para obter o nome exe do processo. Jogue isso lá também, classifique-o pelo número de relógios e redirecione-o para um arquivo para proteção e obteremos:Executando isso sem o sudo para apenas mostrar meus processos que iniciei acima, recebo:
Perfeito! Uma lista de processos, fd's e quantos relógios cada um está usando, exatamente o que eu precisava.
fonte
lsof
para esse fim, recomendo o uso dos-nP
sinalizadores para evitar pesquisas desnecessárias de nomes de porta e DNS reversos. Nesse caso em particular,-bw
também é recomendável adicionar para evitar o bloqueio potencial de syscalls. Dito isso, com olsof
consumo de 3 segundos do relógio de parede na minha humilde estação de trabalho (dos quais 2 segundos são gastos no kernel), essa abordagem é boa para a exploração, mas é inadequada para fins de monitoramento.lsof | awk '/a_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | sed 's/fdinfo.*//' | sort | uniq > uniq-o
entãocat uniq-o | while read fdi; do count=$(cat ${fdi}fdinfo/* | grep -c inotify 2>/dev/null); exe=$(readlink ${fdi}exe); echo -e $count"\t"${fdi}"\t"$exe; done > watches
Para rastrear quais processos consomem inotify watches (não instâncias), você pode usar o recurso ftrace dinâmico do kernel, se estiver ativado no kernel.
A opção do kernel que você precisa é
CONFIG_DYNAMIC_FTRACE
.Primeiro monte o sistema de arquivos debugfs se ele ainda não estiver montado.
Vá sob o
tracing
subdiretório deste diretório debugfsAtivar rastreamento de chamadas de função
Filtrar apenas
SyS_inotify_add_watch
chamadas do sistemaLimpe o buffer do anel de rastreamento se não estiver vazio
Ativar rastreio se ainda não estiver ativado
Reinicie o processo suspeito (no meu caso, era um plano de falha, um aplicativo de backup)
Assista ao inotify_watch sendo esgotado
Feito
fonte
fonte
Eu modifiquei o script presente acima para mostrar a lista de processos que estão consumindo inotify recursos:
Eu acho que existe uma maneira de substituir o meu sed duplo .
Sim. Use um
ou
e você só receberá o pid.
Além disso, se você adicionar
na descoberta, você se livra de quaisquer linhas de erro traquinas lançadas pela descoberta. Então, isso funcionaria:
fonte