¿Por qué es tan ridículamente lento lsof en OS X?

24

No puedo entender por qué lsof en mi Mac (10.8.2, MacBook Pro) es tan lento.

En mi Mac, lsof toma más de un minuto:

$ touch /tmp/testfile
$ time lsof /tmp/testfile

real   1m16.483s
user   0m0.029s
sys    1m15.969s

En un cuadro típico de Linux, ejecutando Ubuntu 12.04, lsof toma 20 ms:

$ touch /tmp/testfile
$ time lsof /tmp/testfile

real   0m0.023s
user   0m0.008s
sys    0m0.012s

El problema persiste si ejecuto lsof -n (para evitar las búsquedas de DNS). Además, traté de verificar qué llamadas del sistema realiza lsof usando dtruss , y encontré que está llamando a proc_info decenas de miles de veces:

$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | sort | uniq -c | sort -nr | head
10000 proc_info(0x2, 0x1199, 0x8) = 1272 0
 6876 proc_info(0x2, 0x45, 0x8) = 1272 0
 2360 proc_info(0x2, 0x190D, 0x8) = 1272 0
 1294 proc_info(0x2, 0xFF, 0x8) = 1272 0
 1152 proc_info(0x2, 0x474, 0x8) = 1272 0
 1079 proc_info(0x2, 0x2F, 0x8) = 1272 0
  709 proc_info(0x2, 0xFE, 0x8) = 1272 0
  693 proc_info(0x2, 0x1F, 0x8) = 1272 0
  623 proc_info(0x2, 0x11A, 0x8) = 1272 0
  528 proc_info(0x2, 0xF7, 0x8) = 1272 0

¿Alguna idea? He ejecutado estas pruebas y he obtenido los mismos resultados utilizando la versión de lsof incluida con OS X (4.85) y la última versión de ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87).

(Para los curiosos, la razón por la que me siento frustrado por este rendimiento es que cuando arrastro imágenes a Evernote, se ejecuta lsof en el proceso de copiar el archivo, lo que provoca que mi sistema se bloquee durante un minuto completo cada vez Intento insertar una imagen en Evernote.)

    
pregunta Jason 05.02.2013 - 19:48

3 respuestas

5

Según mi experiencia, desde Mac OS X 10.7 (Lion) hasta 10.11.5 (EI Capitan), el lsof siempre se cuelga.

Para resolver un problema, agregue la opción -n . lsof -n

Según el manual de lsof , la opción -n : inhibits the conversion of network numbers to host names for network files. Inhibiting conversion may make lsof run faster. It is also useful when host name lookup is not working properly

EDIT 2018-04-25: Si aún es lento, puedes intentarlo

-O to bypass  the  strategy it uses to avoid being blocked by some kernel operations
-P to inhibits the conversion of port numbers to port names for network files
-l to inhibits  the  conversion of user ID numbers to login names

La mejor manera de descubrir por qué es tan lento es ejecutar la herramienta "Instrumentos" (desde el ícono de búsqueda de Spotlight en la esquina superior derecha) para hacer un "Seguimiento del sistema" en / usr / sbin / lsof y luego ver las llamadas de gráficos y sistemas.

    
respondido por el osexp2003 20.06.2016 - 11:08
3

Creo que la mayor parte del problema es que macOS se está volviendo cada vez más ridículo con capas infladas e innecesarias sobre capas de marcos inútiles. Esto ha significado cientos de procesos adicionales y miles de archivos adicionales que se mantienen abiertos, lo que aumenta la cantidad de trabajo que lsof tiene que hacer al menos en un orden de magnitud, y quizás más como dos órdenes.

lsof pasó de una velocidad razonable a una velocidad atroz entre 10.6 y 10.13.

Aquí, en un sistema 10.13.4 actual, veo lo siguiente con solo 7 aplicaciones abiertas y en ejecución (Terminal, Chrome, Calendario, Finder, Adium, IPGadget y Stickies). (Chrome tiene 7 ventanas, con quizás 10 pestañas cada una).

# ps ax | wc -l
     401
# time lsof -lnP | wc -l
   10976

real    0m49.684s
user    0m0.250s
sys 0m40.172s

Durante la ejecución, ambas CPU tienen más del 50% de tiempo del sistema

Agregar -O ayuda a veces, especialmente si lsof no se ha ejecutado últimamente, pero lo mejor que he visto fue alrededor del 10% de ahorro. Por lo general, es minúsculo y es probable que no valga la pena los riesgos descritos en la página del manual:

# time lsof -lnPO | wc -l
   10994

real    0m47.482s
user    0m0.249s
sys 0m40.472s

dtruss afirma que hay más de 89,000 llamadas a proc_info() con mi carga de proceso actual, y esas se encuentran en el kernel, y como time informa, la gran mayoría del tiempo invertido está en el kernel. No sé por qué hay aproximadamente 8 llamadas por archivo abierto.

Lamentablemente, macOS / Darwin no incluye el comando BSD fstat cada vez más útil y eficiente.

    
respondido por el Greg A. Woods 11.05.2018 - 22:39
1

No tengo una buena respuesta de por qué su sistema parece tardar un minuto más que mi Mac más lenta para llamar a proc_info 30 mil veces, pero su tiempo muestra que tanto Linux como OS X están en el rango de 10 ms para tiempo de usuario para ejecutar lsof. ¿Puede reproducir ese arranque lento en modo seguro para descartar otras cargas en su CPU?

He probado tres Mac y las que ejecutan 10.7.5 son aproximadamente un segundo más rápidas que mi 10.8.2 Mac. Los sistemas operativos más antiguos son procesadores Core 2 Duo más lentos y creo que un Mac i7 que ejecute el sistema operativo más nuevo sería tan rápido o más rápido que los sistemas operativos y CPU más antiguos, pero estaría equivocado.

Todas las máquinas realizan aproximadamente el mismo número de llamadas proc_info, y todas las máquinas tienen un tiempo de usuario magro para el comando, pero es posible que tenga una sincronización global más lenta (y no tengo idea de por qué la suya es tan drásticamente más lenta que mi Mountain Lion Mac).

11 inch Air (i7) 2011 ejecutando Mountain Lion - SSD:

$ system_profiler SPSoftwareDataType
      System Version: OS X 10.8.2 (or something)
      Kernel Version: Darwin 12.3.0
      Secure Virtual Memory: Enabled
$ time lsof /tmp/testfile 

real    0m1.179s
user    0m0.012s
sys     0m1.158s
$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | sort | uniq -c | sort -nr | head
9310 proc_info(0x2, 0x68, 0x8)           = 1272 0
1220 proc_info(0x2, 0xCEB6, 0x8)                 = 1272 0
$ cat /tmp/dump | cut -c -9 | sort | uniq -c | sort -nr | head
30884 proc_info
 116 write(0x4
  87 read(0x5,
  60 sigaction
  60 setitimer
  35 stat64("/
  30 sigprocma
  30 sigaltsta
  21 close(0x3
  18 close(0x6 

MacBook Pro de 15 pulgadas con Lion Server - HDD:

$ system_profiler SPSoftwareDataType
      System Version: Mac OS X Server 10.7.5 (11G63)
      Kernel Version: Darwin 11.4.2
$ time lsof /tmp/testfile

real    0m0.329s
user    0m0.005s
sys     0m0.324s

iMac de 27 pulgadas con Lion - HDD:

$ system_profiler SPSoftwareDataType
      System Version: Mac OS X 10.7.5 (11G63b)
      Kernel Version: Darwin 11.4.2
$ time lsof /tmp/testfile

real    0m0.066s
user    0m0.002s
sys     0m0.065s
$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | cut -c -9 | sort | uniq -c | sort -nr | head
23034 proc_info
 188 write(0x4
 141 read(0x5,
  96 sigaction
  96 setitimer
  48 sigprocma
  48 sigaltsta
  31 stat64("/
  21 close(0x3
  18 close(0x6
    
respondido por el bmike 12.02.2013 - 21:15

Lea otras preguntas en las etiquetas