Como posso saber se estou sem relógios inotify?

36

Eu uso um aplicativo que consome inotify relógios. Eu já já definido

fs.inotify.max_user_watches=32768

em /etc/sysctl.conf , mas ontem à noite o aplicativo parou de indexar, a menos que eu o execute manualmente, o que me leva a suspeitar que estou sem relógios.

Já que eu não sei qual é a desvantagem quando eu aumento esse número (ele consome mais memória RAM?), eu não sei se eu deveria aumentar esse número, então eu gostaria de saber se há uma maneira que eu posso dizer se está usando todos esses relógios e quais as compensações para aumentá-lo.

    
por Jorge Castro 21.06.2012 / 19:28

2 respostas

51

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

  • Inicie tail com a opção -f (follow) em qualquer arquivo antigo, por exemplo %código%:
    • Se tudo estiver bem, mostrará as últimas 10 linhas e fará uma pausa; abortar com Ctrl-C
    • Se estiver sem relógios , ele falhará com este erro um pouco enigmático :
      tail: cannot watch '/var/log/dmsg': No space left on device

Para os curiosos: Por que é tail um "telltail"?

  • Na verdade, qualquer aplicativo bem escrito deve ter a cortesia de dizendo-lhe, uma vez que a inotify API / chamadas diz claramente qual é o negócio.
  • Experimente tail -f /var/log/dmesg e, quando for bem sucedido, termina com:
    inotify_add_watch(4, "/var/log/dmesg", IN_MODIFY...) = 1
    
  • mas se falhar, ou seja, você está sem relógios , ele dirá:
    inotify_add_watch(4, "/var/log/dmesg", IN_MODIFY..)
    = -1 ENOSPC (No space left on device)
    

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

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

  • Cada relógio de inotify usado ocupa 540 bytes (sistema de 32 bits) ou 1 kB (duplo em 64 bits) [fontes: 1 , 2 ]
  • Isso vem da memória do kernel , que não pode ser mudada.
  • Assim, supondo que você definiu o máximo em 524288, e todos foram usados (improvável), você usaria aprox. 256 MB / 512 MB de memória de kernel de 32 bits / 64 bits

    • Observe que seu aplicativo também usará memória adicional para acompanhar as alças de inotificação, os caminhos de arquivos / diretórios etc. - o quanto depende do design.
  • Qual é o valor máximo? Eu acho que nenhum, em teoria, contanto que você tenha RAM suficiente. Na prática, 524288 foi oficialmente recomendado pelos aplicativos , e as pessoas têm foram definindo-o para 2 milhões , com o uso de memória associado, claro.

por ish 24.06.2012 / 17:17
8

Não sei se devo aumentar esse número

A maneira fácil de verificar se você alcançou o valor max_user_watches é, com seu usuário, usar inotifywatch do pacote inotify-tools e verificar se você ainda pode coletar informações de um arquivo.

Por exemplo, inotifywatch -v /home/bruno/.profile para mim retorna:

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

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

Se você atingiu seu limite máximo em 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 de relógios permitido.

Consome mais RAM?

Sim, é verdade. Mas, de acordo com este artigo antigo , a quantidade que consome é mínima em comparação com outros aspectos de um desktop em execução.

% bl0ck_qu0te%

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

Postagens relacionadas sobre inotify

por Bruno Pereira 24.06.2012 / 12:13