Limite de observação do inotify do kernel atingido

206

Atualmente, estou enfrentando um problema em uma caixa Linux onde, como root, tenho comandos retornando erro porque o limite de exibição do inotify foi atingido.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

Pesquisei um pouco no Google e toda solução que encontrei é aumentar o limite com:

sudo sysctl fs.inotify.max_user_watches=<some random high number>

Mas não consegui encontrar nenhuma informação sobre as consequências de aumentar esse valor. Eu acho que o valor padrão do kernel foi definido por uma razão, mas parece inadequado para usos específicos. (por exemplo, ao usar o Dropbox com um grande número de pastas ou software que monitora muitos arquivos)

Então, aqui estão as minhas questões:

  • É seguro aumentar esse valor e quais seriam as consequências de um valor muito alto?
  • Existe uma maneira de descobrir quais são os relógios atualmente configurados e qual processo os define para poder determinar se o limite atingido não é causado por um software com defeito?
Ultraspider
fonte
Você provavelmente já verificou isso agora, já que tem 8 meses, mas sua unidade está cheia? "cauda: não é possível assistir '/ var / log / messages': não há espaço no dispositivo"
froggythefrog

Respostas:

273

É seguro aumentar esse valor e quais seriam as consequências de um valor muito alto?

Sim, é seguro aumentar esse valor e abaixo estão os possíveis custos [ fonte ]:

  • Cada relógio inotify usado ocupa 540 bytes (sistema de 32 bits) ou 1 kB (duplo em 64 bits) [fontes: 1 , 2 ]
  • Isso sai da memória do kernel , que não pode ser trocada.
  • Supondo que você definiu o máximo em 524288 e todos foram usados ​​(improvável), você usaria aproximadamente 256 MB / 512 MB de memória do kernel de 32 bits / 64 bits.
    • Observe que seu aplicativo também usará memória adicional para acompanhar os identificadores inotify, caminhos de arquivo / diretório etc. - quanto depende de seu design.

Para verificar o número máximo de relógios inotify:

cat /proc/sys/fs/inotify/max_user_watches

Para definir o número máximo de relógios inotify

Temporariamente:

  • Execute sudo sysctl fs.inotify.max_user_watches=com o seu valor preferido no final.

Permanentemente ( informações mais detalhadas ):

  • coloque fs.inotify.max_user_watches=524288em suas configurações de sysctl. Dependendo do seu sistema, eles podem estar em um dos seguintes locais:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: coloque um novo arquivo /etc/sysctl.d/, por exemplo/etc/sysctl.d/40-max-user-watches.conf
  • você pode recarregar as configurações do sysctl para evitar uma reinicialização: sysctl -p(Debian / RedHat) ou sysctl --system(Arch)

Verifique se o número máximo de relógios inotify foi atingido:

Use tailcom a -fopção (seguir) em qualquer arquivo antigo, por exemplo tail -f /var/log/dmesg: - Se tudo estiver bem, ele mostrará as últimas 10 linhas e pausará; abortar com Ctrl-C - Se você estiver sem relógios , ele falhará com este erro um tanto enigmático :

cauda: não é possível assistir '/ var / log / dmsg': não há espaço no dispositivo

Para ver o que está usando os relógios inotify

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

A primeira coluna indica o número de inotify fds (embora não seja o número de relógios) e a segunda mostra o PID desse processo [fontes: 1 , 2 ].

tshepang
fonte
3
I guess very few codes need the values higher than the defaultO Dropbox pode exigir um limite mais alto, dependendo de quantos arquivos você possui. Iv'e levantou a minha sem problemas. de fato, a notificação da caixa de depósito (que ocorre quando atinge o limite) explicitamente solicita que você a aumente.
Falmarri 25/05
11
@ ultrasawblade- inotify substituído dnotify. O dnotify era lento e com bugs. O inotify pode ser usado em diretórios e um diretório será "alterado" quando um dos arquivos desse diretório (um nível de profundidade) for modificado. Diretórios são apenas arquivos de qualquer maneira.
beatgammit
6
"Permanentemente: substitua o valor dentro de / proc / sys / fs / inotify / max_user_watches" <- isso está incorreto. Para tornar isso permanente você precisa mudar/etc/sysctl.conf
Merc
3
sysctl! = systemd, na sua explicação. E /etc/sysctl.dtambém funciona em sistemas mais novos baseados em RedHat.
aairey
11
@stackexchanger Se você tiver certeza de que eles são semelhantes (por exemplo, você testou), envie e edite para a pergunta. Eu mesmo não verifiquei e sei que as distros tendem a corrigir pacotes, portanto o comportamento pode ser diferente para os mesmos pacotes. Isso também não menciona diferenças nas versões dos pacotes.
tshepang