¿Cómo puedo saber si no tengo relojes inotify?

47

Yo uso una aplicación que consume relojes inotify. Ya he establecido

fs.inotify.max_user_watches=32768

en /etc/sysctl.confpero anoche la parada de la aplicación de indexación a no ser que me encontré de forma manual, lo que me lleva a sospechar que estoy fuera de los relojes.

Como no sé cuál es la compensación cuando aumento este número (¿consume más RAM?), No sé si debería aumentar este número, por lo que me gustaría saber si hay alguna forma de puede saber si está usando todos estos relojes y cuáles serían las compensaciones para aumentarlo.

Jorge Castro
fuente
Esta pregunta se ha vuelto bastante relevante nuevamente, ya que resulta que en 18.04 desbloquear la pantalla no es posible si uno se ha quedado sin relojes de inodo.
Kasperd

Respuestas:

64

¿Cómo sabes si no tienes relojes? la cola lo dirá!

  • Comience tailcon la -fopción (seguir) en cualquier archivo antiguo, por ejemplo tail -f /var/log/dmesg:
    • Si todo está bien, mostrará las últimas 10 líneas y la pausa; abortar con Ctrl-C
    • Si no tiene relojes , fallará con este error algo críptico :
      tail: no se puede ver '/ var / log / dmsg': no ​​queda espacio en el dispositivo

Para los curiosos: ¿Por qué la cola es un "indicador"?

  • En realidad, cualquier aplicación bien escrita debe tener la cortesía de decírtelo, ya que la API / llamadas de inotify les dice claramente cuál es el trato.
  • Intente en su strace tail -f ...lugar, y cuando tenga éxito, termina con:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • pero si falla, es decir , se te acabó el reloj , dirá:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (No queda espacio en el dispositivo)
    

¿Puedes aumentar los relojes? ¿Por cuanto? ¿Alguna compensación?

Respuesta corta: Claro, sin sudar. Vaya directamente a medio millón (524288) si lo desea ... la memoria adicional utilizada debería ser insignificante en un sistema moderno con 4GB + de memoria.

  • Cada reloj inotify utilizado ocupa 540 bytes (sistema de 32 bits) o 1 kB (doble en 64 bits) [fuentes: 1 , 2 ]
  • Esto sale de la memoria del núcleo , que no se puede cambiar.
  • Entonces, suponiendo que establezca el máximo en 524288, y todos se hayan utilizado (improbable), estaría utilizando aprox. 256 MB / 512 MB de memoria de kernel de 32 bits / 64 bits

    • Tenga en cuenta que su aplicación también usará memoria adicional para realizar un seguimiento de los identificadores de inotify, rutas de archivo / directorio, etc. - cuánto depende de su diseño.
  • ¿Cuál es el valor máximo? Supongo que ninguno, en teoría, siempre que tenga suficiente RAM. En la práctica, 524288 ha sido oficialmente recomendado por las aplicaciones , y la gente lo ha estado configurando en 2 millones , con el uso de memoria que lo acompaña, por supuesto.

ish
fuente
55
Si también desea saber el número actual real de relojes inotify (por lo tanto, más que sí / no), sudo lsof | grep -i inotify | wc -l
busque
2
enlace "aplicación bien escrita" roto.
Gaurav Sharma
11

No sé si debería aumentar este número

La manera fácil de verificar si alcanzó su max_user_watchesvalor es, con su usuario, usarlo inotifywatchdesde el paquete inotify-tools, y verificar si aún puede recopilar información de un archivo.

Por ejemplo inotifywatch -v /home/bruno/.profilepara mí devuelve:

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

Por lo tanto, inotifyno tiene problemas para crear un reloj nuevo, no hay problemas aquí.

Si ha alcanzado su límite máximo en relojes inotify, le devolverá algo como

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

Si ve algo como esto, ha alcanzado el límite y deberá aumentar el límite permitido de relojes.

¿Consume más RAM?

Si lo hace. Pero según este antiguo artículo, la cantidad que consume es mínima en comparación con otros aspectos de un escritorio en ejecución.

--USO DE MEMORIA--

Las estructuras de datos de inotify son ligeras:

el reloj inotify tiene 40 bytes el dispositivo inotify tiene 68 bytes el evento inotify tiene 272 bytes

Asumiendo que un dispositivo tiene 8192 relojes, las estructuras solo consumirán 320 KB de memoria. Con un número máximo de 8 dispositivos permitidos a la vez, esto sigue siendo solo 2.5 MB

Cada dispositivo también puede tener 256 eventos en cola a la vez, lo que equivale a 68 KB por dispositivo. Y solo .5 MB si todos los dispositivos están abiertos y tienen una cola de eventos completa.

Por lo tanto, se utilizan aproximadamente 3 MB de memoria en el raro caso de que todo esté abierto y lleno.

Cada reloj inotify fija el inodo de un directorio / archivo en la memoria, el tamaño de un inodo es diferente por sistema de archivos, pero supongamos que es 512 byes.

Entonces, suponiendo que el número máximo de relojes globales esté activo, esto fijaría 32 MB de inodes en el caché de inodes. De nuevo, no es un problema en un sistema moderno.

Por supuesto, estoy asumiendo que las cosas no cambiaron mucho desde que se escribió el artículo, pero mirando los números no me preocuparía y aumentar el límite no aumentará mucho el consumo de RAM.


Publicaciones relacionadas sobre inotify

Bruno Pereira
fuente
Lo siento, tuve un borrador abierto ayer durante unas horas y no vi tu respuesta antes de publicar la mía. Supongo que está bien, ya que tienen dos enfoques diferentes :-) ¿Podría aclarar que en los núcleos recientes, inotify utiliza 0.5 KB (en 32 bits) o 1 KB (64 bits) de memoria del núcleo por reloj, ya que la información anterior de 2005 ya no parece ser cierto?
ish