Como posso saber se estou sem relógios inotify?

47

Eu uso um aplicativo que consome inotify relógios. Eu coloquei

fs.inotify.max_user_watches=32768

em /etc/sysctl.confmas a noite passada o aplicativo parou de indexação, a menos que eu corri-lo manualmente, o que me leva a suspeitar que eu estou fora de relógios.

Como não sei qual é o problema quando aumento esse número (consome mais RAM?), Não sei se devo aumentar esse número, então gostaria de saber se há uma maneira de pode dizer se está usando todos esses relógios e quais podem ser as trocas para aumentá-lo.

Jorge Castro
fonte
Esta questão tornou-se bastante relevante novamente, pois, na versão 18.04, desbloquear a tela não é possível se alguém ficar sem relógios de inode.
kasperd 21/01

Respostas:

64

Como você sabe se você está sem relógios? cauda dirá!

  • Comece tailcom a -fopção (seguir) em qualquer arquivo antigo, por exemplo tail -f /var/log/dmesg:
    • Se tudo estiver bem, mostrará as últimas 10 linhas e pausará; abortar com Ctrl-C
    • Se você estiver sem relógio , 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 os curiosos: Por que a cauda é um "sinal de alerta"?

  • Na verdade, qualquer aplicativo bem escrito deve ter a cortesia de informar, pois a API / chamadas da inotify informa claramente a eles qual é o acordo.
  • Tente em strace tail -f ...vez disso e, quando for bem-sucedido, termina com:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • mas se falhar, ou seja, você estiver sem relógio , dirá:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (Não há espaço no dispositivo)
    

Você pode aumentar os relógios? Por quanto? Alguma troca?

Resposta curta: Claro, sem suor. Vá direto para meio milhão (524288) se desejar ... a memória adicional usada deve ser insignificante em um sistema moderno com 4 GB + de memória.

  • 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.
  • Portanto, supondo que você defina o máximo em 524288 e que todos foram usados ​​(improvável), você usaria aprox. 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.
  • Qual é o valor máximo? Eu acho que nenhum, em teoria, desde que você tenha RAM suficiente. Na prática, o 524288 foi oficialmente recomendado pelos aplicativos , e as pessoas o definiram para 2 milhões , com o uso de memória que acompanha, é claro.

ish
fonte
5
Se você também quer saber o número atual de relógios inotify (portanto, mais então sim / não), ir parasudo lsof | grep -i inotify | wc -l
Frank Nocke
2
Link "aplicativo bem escrito" quebrado.
Gaurav Sharma
11

Não sei se devo aumentar esse número

A maneira mais fácil de verificar se você atingiu seu max_user_watchesvalor é, com seu usuário, usar inotifywatcho pacote inotify-toolse verificar se você ainda pode coletar informações de um arquivo.

Por exemplo inotifywatch -v /home/bruno/.profilepara mim retorna:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

Portanto inotify, não há problemas ao criar um novo relógio, não há problemas aqui.

Se você atingiu seu limite máximo nos relógios inotify, ele retornará algo como

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

Se você vir algo assim, atingiu o limite e precisará aumentar o limite permitido de relógios.

Consome mais RAM?

Sim. Mas, de acordo com este artigo antigo, a quantidade consumida é mínima em comparação com outros aspectos de uma área de trabalho em execução.

--USO DE MEMÓRIA--

As estruturas de dados inotify são leves:

inotify watch é 40 bytes inotify device é 68 bytes inotify event é 272 bytes

Então, supondo que um dispositivo possua 8192 relógios, as estruturas consumirão apenas 320 KB de memória. Com um número máximo de 8 dispositivos autorizados por vez, isso ainda é de apenas 2,5 MB

Cada dispositivo também pode ter 256 eventos na fila por vez, o que equivale a 68 KB por dispositivo. E apenas 0,5 MB se todos os dispositivos estiverem abertos e tiverem uma fila de eventos completa.

Portanto, aproximadamente 3 MB de memória são usados ​​no caso raro de tudo aberto e cheio.

Cada relógio inotify fixa o inode de um diretório / arquivo na memória, o tamanho de um inode é diferente por sistema de arquivos, mas vamos supor que sejam 512 bytes.

Portanto, supondo que o número máximo de vigias globais esteja ativo, isso reduziria 32 MB de inodes no cache de inodes. Novamente, não é um problema em um sistema moderno.

Obviamente, estou assumindo que as coisas não mudaram muito desde que o artigo foi escrito, mas olhando para os números, não me preocuparia e aumentar o limite não aumentará muito o consumo de RAM.


Publicações relacionadas sobre inotify

Bruno Pereira
fonte
Desculpe cara, ontem tive um rascunho aberto por algumas horas e não vi sua resposta antes de postar a minha. Eu acho que não há problema, pois eles têm duas abordagens diferentes :-) Você poderia esclarecer que, nos kernels recentes, o inotify usa 0,5 KB (em 32 bits) ou 1 KB (64 bits) de memória do kernel por relógio, desde as informações antigas de 2005 não parece mais ser verdade?
Ish