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 taileso 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 sysctlconfiguració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' -printfind /proc/*/fd/* -type l -lname 'anon_inode:inotify' -exec sh -c 'cat $(dirname {})/../cmdline; echo ""' \; 2>/dev/nullProbablemente 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/enablepara permitir el seguimiento de las adiciones de reloj;cat /sys/kernel/debug/tracing/tracing_enabledpara asegurarse de que esté configurado en 1 y si no lo estáecho 1 >> /sys/kernel/debug/tracing/tracing_enabled;/sys/kernel/debug/tracing/tracepara 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_onen 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_modulescarpeta 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
inotifyinstancias 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
tailarchivo de prueba y miré los archivos que abrió:Entonces, 4 es el fd que queremos investigar. Veamos qué hay
fdinfopara eso:¡Parece una entrada para el reloj en la parte inferior!
Probemos algo con más relojes, esta vez con la
inotifywaitutilidad, solo mirando lo que esté en/tmp:¡Ajá! Más entradas! Entonces deberíamos tener seis cosas
/tmp:Excelente. Mi nuevo
inotifywaittiene una entrada en sufdlista (que es lo que cuentan las otras frases aquí), pero seis entradas en sufdinfoarchivo. Por lo tanto, podemos averiguar cuántos relojes está utilizando un fd determinado para un proceso determinado consultando sufdinfoarchivo. 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
awkpara construir unafdinforuta desde lalsofsalida, tomando el número pid y fd, quitando el indicador u / r / w de este último. Luego, para cadafdinforuta construida , cuento el número deinotifylí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
dirnamedos veces en elfdinfocamino para llegar al paquete/proc/<pid>, añadiendo/exea ella, y luego ejecutandoreadlinken 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
lsofpara este propósito, recomendaría usar las-nPbanderas para evitar búsquedas innecesarias de DNS inverso y nombres de puerto. En este caso particular,-bwtambién se recomienda agregar para evitar posibles bloqueos del sistema. Dicho esto, conlsofengullir 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-oluegocat 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 > watchesPara 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
tracingsubdirectorio de este directorio debugfsHabilitar el rastreo de llamadas a funciones
Filtra solo
SyS_inotify_add_watchllamadas 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