4 votos

Determine qué aplicación está abriendo demasiados archivos

A veces mi Mac empieza a comportarse de forma extraña, y un síntoma típico es que no puedo abrir ciertas aplicaciones que últimamente funcionaban bien. Esto acaba de ocurrir y he descubierto que este problema se debe a un exceso de archivos abiertos en el sistema. Por ejemplo:

$ man lsof
sh: pipe error: Too many open files in system
Error executing formatting or display command.
System command (cd '/usr/share/man' && (echo ".ll 24.1i"; echo ".nr LL 24.1i"; /bin/cat '/usr/share/man/man8/lsof.8') | /usr/bin/tbl | /usr/bin/groff -Wall -mtty-char -Tascii -mandoc -c | (/usr/bin/less -is || true)) exited with status 33024.
Man page /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/share/man/man8/lsof.8 is identical to /usr/share/man/man8/lsof.8
No manual entry for lsof

También:

$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome 
dlopen /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework: dlopen(/Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework, 261): no suitable image found.  Did find:
    /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework: open() failed with errno=23
    /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework: stat() failed with errno=3
    /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Google Chrome Framework: open() failed with errno=23
[0822/142149.543101:ERROR:mac_util.cc(204)] _CFCopySystemVersionDictionary failed
[0822/142149.543447:WARNING:process_memory_mac.cc(93)] mach_vm_read(0x7ffee8237000, 0x2000): (os/kern) invalid address (1)
[92085:775:0822/112149.554485:FATAL:process_singleton_posix.cc(236)] : Too many open files in system (23)
[0822/142149.557563:ERROR:file_io_posix.cc(140)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/settings.dat: Too many open files in system (23)
[0822/142149.557717:ERROR:file_io_posix.cc(148)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/new/85472cbe-1c22-4598-94bf-a964bf67b0c5.dmp: Too many open files in system (23)
[0822/142149.558108:ERROR:mac_util.cc(204)] _CFCopySystemVersionDictionary failed
[0822/112149.558599:WARNING:process_memory_mac.cc(93)] mach_vm_read(0x7ffeef5d5000, 0x2000): (os/kern) invalid address (1)
[92089:775:0822/112149.643059:ERROR:resource_bundle.cc(803)] Failed to load /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Resources/chrome_100_percent.pak
Some features may not be available.
[92089:775:0822/112149.643114:ERROR:resource_bundle.cc(803)] Failed to load /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Resources/chrome_200_percent.pak
Some features may not be available.
[92089:775:0822/112149.643192:ERROR:resource_bundle.cc(363)] failed to load locale.pak
[92089:775:0822/112149.643221:ERROR:resource_bundle.cc(803)] Failed to load /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Resources/resources.pak
Some features may not be available.
[0822/112149.648315:ERROR:file_io_posix.cc(140)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/settings.dat: Too many open files in system (23)
[0822/112149.648369:ERROR:file_io_posix.cc(148)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/new/f3454bf7-4dc1-4a39-9b23-112edbf9565b.dmp: Too many open files in system (23)
[0822/112149.649774:ERROR:mac_util.cc(204)] _CFCopySystemVersionDictionary failed
[0822/112149.649989:WARNING:process_memory_mac.cc(93)] mach_vm_read(0x7ffee426c000, 0x2000): (os/kern) invalid address (1)
Trace/BPT trap: 5
[0822/112149.746121:WARNING:system_snapshot_mac.cc(42)] sysctlbyname kern.nx: No such file or directory (2)

He reiniciado algunas aplicaciones y he conseguido volver a bajar el límite y ejecutar nuevas aplicaciones.

Sin embargo, me gustaría ser más sistemático. Por lo que sé, las pocas aplicaciones que reinicié fueron apenas suficientes para bajar el límite, y pronto me encontraré con el mismo problema. En lugar de cerrar aplicaciones al azar que pueden o no estar contribuyendo a este problema, me gustaría localizar la aplicación específica que está acaparando manejadores de archivos y cerrarla.

Pensé que lsof me ayudaría a localizar la aplicación problemática, pero analizar manualmente su salida por defecto es inviable. Podría escribir un shell script o un programa de Python para agrupar los gestores de archivos por aplicación, pero estoy pensando que puede haber un interruptor para lsof que haga esta agrupación automáticamente, o tal vez una aplicación similar a Activity Monitor pero que muestre el número de manejadores de archivos abiertos por proceso.

Mi pregunta entonces es: ¿cómo puedo mostrar el número de gestores de archivos abiertos agrupados por proceso?

Estoy ejecutando MacOS 10.14.5, si eso supone una diferencia. Además, aunque soy consciente de que puedo aumentar el límite de archivos abiertos, creo que el verdadero problema es que una de mis aplicaciones está esencialmente filtrando recursos, no como una fuga de memoria, y es mejor para el rendimiento del sistema simplemente reiniciar la aplicación afectada que aumentar ciegamente los límites y permitir que la aplicación siga acaparando recursos.

4voto

Kipper Puntos 71

Es hora de traer el poder de las tuberías de Unix, sort y awk al rescate. Pero como lsof tarda mucho en ejecutarse, guardaré la salida y la analizaré, en lugar de pasar lsof directamente a la tubería.

Como referencia, este es el formato de salida de lsof:

[iMac:~] droot% head /tmp/a
COMMAND    PID  USER   FD      TYPE             DEVICE   SIZE/OFF     NODE NAME
loginwind   94 droot  cwd       DIR                1,7        896        2 /
loginwind   94 droot  txt       REG                1,7    1237152 18011104 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow
loginwind   94 droot  txt       REG                1,7      21024 18566026 /Library/Preferences/Logging/.plist-cache.HrVraTtH
loginwind   94 droot  txt       REG                1,7   27154336 18044520 /usr/share/icu/icudt62l.dat

Y mi análisis:

lsof > /tmp/a
cat /tmp/a | awk '{print $2}' | sort | uniq -c | sort -r -n | head

 511 724
 469 2790
 384 2791
 360 2793
 350 2798
 227 286
 224 658
 210 3833
 197 655
 190 698

Explicación de las líneas no obvias:

  1. awk '{print $2}' imprime el segundo campo de cada línea (el PID en este caso). Esto es todo el awk que recuerdo. ¡Realmente útil!
  2. uniq -c Toma una lista ordenada de PIDs y elimina las líneas adyacentes duplicadas, con el modificador -c añade un recuento del número de líneas encontradas (en nuestro caso es una línea por archivo abierto de ese proceso).
  3. "sort -r -n" ordena numéricamente en orden inverso (el mayor número en la parte superior)
  4. "head" imprime las 10 primeras líneas (10 procesos con mayor número de archivos abiertos).

Esto muestra que el PID 724 tiene 511 archivos abiertos en mi sistema. Para mirar con más detalle:

cat /tmp/a | grep " 724 "

En mi caso ese proceso era Dropbox, que es "interesante" pero veo que ese proceso puede necesitar muchos archivos abiertos. Así que a por el siguiente:

cat /tmp/a | grep " 2790 "

Y así sucesivamente en la lista. Esperemos que su "delincuente" sea obvio a partir de la salida de lsof ordenada por el número de archivos abiertos por PID.

Para el número total de archivos abiertos utilice "wc" (wordcount):

[iMac:~] droot% cat /tmp/a | wc
9777   90500 1445558

Lo que significa 9776 archivos abiertos en mi caso (hay que restar la línea de cabecera).

1voto

NightCrawler Puntos 111

Acabo de encontrar el Pereza app. Se trata básicamente de una interfaz gráfica de usuario para lsof y es capaz de agrupar y ordenar los procesos por número de archivos, que es exactamente lo que necesito. Lo único que podría pedir que falta es un recuento del número total de archivos abiertos en el sistema.

1voto

awy Puntos 500

Sólo estoy familiarizado con el nivel de utilidad lsof pero, ¿se puede utilizar el Monitor de Actividad de alguna manera? Puede resultar en un pico de uso de la CPU por un poco de tiempo, pero muestra los puertos, hilos y archivos abiertos por proceso después de hacer doble clic en el proceso. Y como ves, muchos archivos están abiertos, sospecho que el uso de la memoria será alto también, así que las aplicaciones pueden ser ordenadas y revisadas de la manera que se muestra a continuación. Es una versión genérica de lo que creo que hace la aplicación Sloth que mencionas.

enter image description here

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X