Después de una actualización reciente a Fedora 15, descubro que varias herramientas están fallando con errores en la línea de:
tail: inotify resources exhausted
tail: inotify cannot be used, reverting to polling
No solo tail
eso es informar problemas con inotify, tampoco. ¿Hay alguna forma de interrogar al kernel para averiguar qué proceso o procesos están consumiendo los recursos de inotify? La sysctl
configuración actual relacionada con inotify se ve así:
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.inotify.max_queued_events = 16384
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -exec sh -c 'cat $(dirname {})/../cmdline; echo ""' \; 2>/dev/null
Probablemente se esté quedando sin relojes inotify en lugar de instancias. Para saber quién está creando muchos relojes:
echo 1 >> /sys/kernel/debug/tracing/events/syscalls/sys_exit_inotify_add_watch/enable
para permitir el seguimiento de las adiciones de reloj;cat /sys/kernel/debug/tracing/tracing_enabled
para asegurarse de que esté configurado en 1 y si no lo estáecho 1 >> /sys/kernel/debug/tracing/tracing_enabled
;/sys/kernel/debug/tracing/trace
para ver cuántos relojes se crean y por qué procesos.Cuando haya terminado, asegúrese de hacer eco de 0 en el archivo de habilitación (y el archivo tracing_enabled si tenía que habilitar eso también) para desactivar el seguimiento para que no incurra en el impacto de rendimiento de continuar rastreando.
fuente
echo 1 | sudo tee /sys/kernel/debug/tracing/tracing_on
en distribuciones modernas (Ubuntu 18.04.2 LTS).Como dijo @Jonathan Kamens, probablemente te estés quedando sin relojes. Tengo un guión preparado de antemano ,
inotify-consumers
, que las listas para el usuario:Aquí puede ver rápidamente por qué el límite predeterminado de los observadores de 8K es demasiado pequeño en una máquina de desarrollo, ya que solo la instancia de WebStorm maximiza rápidamente esto cuando encuentra una
node_modules
carpeta con miles de carpetas. Agregue un monitor webpack para garantizar problemas ...Simplemente copie el contenido del script (o el archivo en GitHub) y póngalo en algún lugar de su
$PATH
, como/usr/local/bin
. Como referencia, el contenido principal del script es simplemente esteEn caso de que se pregunte cómo aumentar los límites, aquí le mostramos cómo hacerlo permanente:
fuente
Me encontré con este problema, y ninguna de estas respuestas te da la respuesta de "¿cuántos relojes usa actualmente cada proceso?" Todas las frases te dan cuántas instancias están abiertas, lo cual es solo una parte de la historia, y las cosas de seguimiento solo son útiles para ver que se abren nuevos relojes.
TL; DR: Esto le dará un archivo con una lista de
inotify
instancias abiertas y la cantidad de relojes que tienen, junto con las imágenes y binarios que los generaron, ordenados en orden descendente por conteo de relojes:Esa es una gran bola de desastre, así que así es como llegué allí. Para comenzar, ejecuté un
tail
archivo de prueba y miré los archivos que abrió:Entonces, 4 es el fd que queremos investigar. Veamos qué hay
fdinfo
para eso:¡Parece una entrada para el reloj en la parte inferior!
Probemos algo con más relojes, esta vez con la
inotifywait
utilidad, solo mirando lo que esté en/tmp
:¡Ajá! Más entradas! Entonces deberíamos tener seis cosas
/tmp
:Excelente. Mi nuevo
inotifywait
tiene una entrada en sufd
lista (que es lo que cuentan las otras frases aquí), pero seis entradas en sufdinfo
archivo. Por lo tanto, podemos averiguar cuántos relojes está utilizando un fd determinado para un proceso determinado consultando sufdinfo
archivo. Ahora para unirlo con algunos de los anteriores para obtener una lista de procesos que tienen abiertos los relojes de notificación y usarlos para contar las entradas en cada unofdinfo
. Esto es similar a lo anterior, así que simplemente volcaré la línea aquí:Hay algunas cosas gruesas aquí, pero lo básico es que utilizo
awk
para construir unafdinfo
ruta desde lalsof
salida, tomando el número pid y fd, quitando el indicador u / r / w de este último. Luego, para cadafdinfo
ruta construida , cuento el número deinotify
líneas y genero el recuento y el pid.Sería bueno si tuviera qué procesos representan estos pids en el mismo lugar, ¿verdad? Ya me lo imaginaba. Así, en un poco desordenado en particular, que se establecieron en llamar
dirname
dos veces en elfdinfo
camino para llegar al paquete/proc/<pid>
, añadiendo/exe
a ella, y luego ejecutandoreadlink
en que para obtener el nombre del exe del proceso. Agregue eso también, ordénelo por número de relojes y rediríjalo a un archivo para guardarlo y obtenemos:Al ejecutar eso sin sudo para mostrar solo mis procesos que inicié anteriormente, obtengo:
¡Perfecto! Una lista de procesos, fd y cuántos relojes usa cada uno, que es exactamente lo que necesitaba.
fuente
lsof
para este propósito, recomendaría usar las-nP
banderas para evitar búsquedas innecesarias de DNS inverso y nombres de puerto. En este caso particular,-bw
también se recomienda agregar para evitar posibles bloqueos del sistema. Dicho esto, conlsof
engullir 3 segundos de tiempo de reloj de pared en mi humilde estación de trabajo (de los cuales 2 segundos se gastan en el núcleo), este enfoque es bueno para la exploración, pero desafortunadamente no es adecuado para fines de monitoreo.lsof | awk '/a_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | sed 's/fdinfo.*//' | sort | uniq > uniq-o
luegocat uniq-o | while read fdi; do count=$(cat ${fdi}fdinfo/* | grep -c inotify 2>/dev/null); exe=$(readlink ${fdi}exe); echo -e $count"\t"${fdi}"\t"$exe; done > watches
Para rastrear qué procesos consumen relojes inotify (no instancias), puede usar la función de trazado dinámico del núcleo si está habilitado en su núcleo.
La opción de núcleo que necesita es
CONFIG_DYNAMIC_FTRACE
.Primero monte el sistema de archivos debugfs si aún no está montado.
Vaya bajo el
tracing
subdirectorio de este directorio debugfsHabilitar el rastreo de llamadas a funciones
Filtra solo
SyS_inotify_add_watch
llamadas del sistemaBorre el búfer del anillo de rastreo si no estaba vacío
Habilite el seguimiento si aún no está habilitado
Reinicie el proceso sospechoso (en mi caso fue crashplan, una aplicación de respaldo)
Mira cómo se agota el inotify_watch
Hecho
fuente
fuente
He modificado el script presente en el cuadro anterior para mostrar la lista de procesos que consumen recursos de inotify :
Creo que hay una manera de reemplazar mi doble sed .
Si. Utilizar cualquiera
o
y solo obtendrás el pid.
Además, si agrega
en el hallazgo, se librará de las molestas líneas de error que arroja find. Entonces esto funcionaría:
fuente