Kernel inotify límite de reloj alcanzado

206

Actualmente estoy enfrentando un problema en un cuadro de Linux donde, como root, tengo comandos que devuelven un error porque se ha alcanzado el límite de vigilancia de inotify.

# 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'.` 

Busqué en Google un poco y cada solución que encontré es aumentar el límite con:

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

Pero no pude encontrar ninguna información sobre las consecuencias de aumentar ese valor. Supongo que el valor predeterminado del kernel se estableció por una razón, pero parece ser inadecuado para usos particulares. (p. ej., cuando se usa Dropbox con una gran cantidad de carpetas o software que monitorea muchos archivos)

Asi que aqui están mis preguntas:

  • ¿Es seguro aumentar ese valor y cuáles serían las consecuencias de un valor demasiado alto?
  • ¿Hay alguna manera de averiguar cuáles son los relojes configurados actualmente y qué proceso los configura para poder determinar si el límite alcanzado no es causado por un software defectuoso?
Ultraspider
fuente
Probablemente ya haya verificado esto ya que tiene 8 meses, pero ¿está llena su unidad? "tail: no se puede ver '/ var / log / messages': no ​​queda espacio en el dispositivo"
froggythefrog

Respuestas:

273

¿Es seguro aumentar ese valor y cuáles serían las consecuencias de un valor demasiado alto?

Sí, es seguro aumentar ese valor y debajo están los posibles costos [ fuente ]:

  • 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.
  • Suponiendo que establezca el máximo en 524288 y se hayan usado todos (improbable), estaría utilizando aproximadamente 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.

Para verificar el número máximo de relojes inotify:

cat /proc/sys/fs/inotify/max_user_watches

Para establecer el número máximo de relojes inotify

Temporalmente:

  • Ejecute sudo sysctl fs.inotify.max_user_watches=con su valor preferido al final.

Permanentemente ( información más detallada ):

  • poner fs.inotify.max_user_watches=524288en su configuración de sysctl. Dependiendo de su sistema, pueden estar en uno de los siguientes lugares:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: poner un nuevo archivo en /etc/sysctl.d/, por ejemplo/etc/sysctl.d/40-max-user-watches.conf
  • es posible que desee volver a cargar la configuración de sysctl para evitar un reinicio: sysctl -p(Debian / RedHat) o sysctl --system(Arch)

Verifique si se ha alcanzado el número máximo de relojes inotify:

Úselo 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 ver qué está usando los relojes 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

La primera columna indica la cantidad de fds de inotify (no la cantidad de relojes) y la segunda muestra el PID de ese proceso [fuentes: 1 , 2 ].

tshepang
fuente
3
I guess very few codes need the values higher than the defaultDropbox puede requerir un límite más alto, dependiendo de cuántos archivos tenga. Iv'e levantó la mía sin problemas. de hecho, la notificación de Dropbox (que ocurre cuando alcanza su límite) le dice explícitamente que lo aumente.
Falmarri
1
@ ultrasawblade- inotify reemplazado dnotify. dnotify fue lento y con errores. inotify se puede usar en directorios, y un directorio se "cambiará" cuando se modifique uno de los archivos en ese directorio (un nivel profundo). Los directorios son solo archivos de todos modos.
beatgammit
66
"Permanentemente: Reemplace el valor dentro de / proc / sys / fs / inotify / max_user_watches" <- esto es incorrecto. Para que esto sea permanente , debe cambiar/etc/sysctl.conf
Merc,
3
sysctl! = systemd, en tu explicación. Y /etc/sysctl.dtambién funciona en los nuevos sistemas basados ​​en RedHat.
aairey
1
@stackexchanger si está muy seguro de que son similares (por ejemplo, lo ha probado), envíe y edite la Pregunta. Yo mismo no lo he verificado, y sé que las distribuciones tienden a parchear paquetes, por lo que el comportamiento podría ser diferente para los mismos paquetes. Esto sin mencionar las diferencias en las versiones del paquete también.
tshepang