Limite de relógio inotify do kernel alcançado

194

Atualmente estou enfrentando um problema em uma caixa Linux onde, como root, tenho comandos retornando erro porque o limite de observação 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'.' 

Eu pesquisei um pouco e cada 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 do kernel padrão foi definido por um motivo, mas parece ser 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 minhas perguntas:

  • É seguro aumentar esse valor e quais seriam as conseqüências de um valor muito alto?
  • Existe uma maneira de descobrir quais são os relógios atualmente definidos e qual processo os define para determinar se o limite atingido não é causado por um software defeituoso?
por Ultraspider 25.05.2011 / 14:43

1 resposta

254

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

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

  • 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.
  • Supondo que você definiu o máximo em 524288 e todos foram usados (improvável), você estaria usando aproximadamente 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.

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 seu valor preferido no final.

Permanentemente ( informações mais detalhadas ):

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

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

Use sysctl --system com a opção tail (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 você está fora dos relógios , ele irá falhar com este um pouco enigmático erro :

tail: cannot watch '/var/log/dmsg': No space left on device

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 (não o número de relógios) e a segunda mostra o PID desse processo [fontes: 1 , 2 ].

    
por 25.05.2011 / 15:21