No puedo entender por qué lsof en mi Mac (10.8.2, MacBook Pro) es tan lento.
En mi Mac, lsof
lleva más de un minuto:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 1m16.483s
user 0m0.029s
sys 1m15.969s
En una caja típica de Linux, ejecutar Ubuntu 12.04 lsof
requiere 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 búsquedas de DNS). Además, intenté verificar qué llamadas al sistema se realizan lsof
utilizando dtruss
, y descubrí que está llamando 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
¿Algunas ideas? Ejecuté estas pruebas y obtuve los mismos resultados utilizando tanto la versión lsof
incluida con OS X (4.85) como 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, haciendo que mi sistema se cuelgue durante un minuto cada vez que intento insertar una imagen en Evernote.)
fuente
lsof
sin argumentos (para enumerar todos los archivos), se cuelga por un minuto y luego imprime todos los archivos. Pero, como mencioné, todavía se cuelga si intento enumerar quién tiene un solo archivo abierto en el directorio / tmp, por lo que no es un archivo abierto en particular el problema. Además, no estoy ejecutando ningún proceso de AirServer.sudo opensnoop -n lsof
.sudo opensnoop -n lsof
ylsof /tmp/testfile
en dos pestañas, y opensnoop solo informó que se habían abierto tres archivos. Entonces, el problema no debe ser un número excesivo de archivos abiertos, sino algo relacionado conproc_info
llamadas excesivas .Respuestas:
Según mi experiencia, desde Mac OS X 10.7 (Lion) hasta 10.11.5 (EI Capitan),
lsof
siempre se cuelgan.Para resolver el problema, agregue la
-n
opción.Según el manual de
lsof
, la-n
opción:EDITAR 25/04/2018: si aún es lento, puedes intentar
La mejor manera de averiguar por qué es tan lento es ejecutar la herramienta "Instrumentos" (desde el icono de Spotlight Search de la esquina superior derecha) para hacer un "Rastreo del sistema" en / usr / sbin / lsof y luego ver las llamadas al gráfico y al sistema.
fuente
-n
cortar milsof +D
abajo de5.31 real
a0.25 real
. Esta opción es para ... realCreo que la mayor parte del problema es que macOS se está volviendo cada vez más ridículo con capas hinchadas e innecesarias sobre capas de marcos derrochadores. Esto ha significado cientos de procesos adicionales y miles de archivos adicionales que se mantienen abiertos, aumentando la cantidad de trabajo que
lsof
tiene que hacer al menos en un orden de magnitud, y tal vez más como dos órdenes.lsof
pasó de velocidad razonable a atrozmente lenta 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).
Durante la ejecución, ambas CPU tienen más del 50% del tiempo del sistema
Agregar
-O
ayuda a veces, especialmente silsof
no se ha ejecutado últimamente, pero lo mejor que he visto fue un 10% de ahorro. Por lo general, es minúsculo y probablemente no justifique los riesgos descritos en la página del manual:dtruss
afirma que hay más de 89,000 llamadasproc_info()
con mi carga de proceso actual, y que están en el kernel, y comotime
informes, la gran mayoría del tiempo dedicado está en el kernel. No sé por qué hay alrededor de 8 llamadas por archivo abierto.Lamentablemente, macOS / Darwin no incluye el
fstat
comando BSD cada vez más útil y eficiente .fuente
No tengo una gran respuesta por qué su sistema parece tardar un minuto más que mi Mac más lenta para llamar
proc_info
30 mil veces, pero su sincronización muestra que tanto Linux como OS X están en el rango de 10 ms para que el usuario ejecute lsof. ¿Puedes reproducir ese arranque lento en modo seguro para descartar otras cargas en tu CPU?He probado tres Mac y las que ejecutan 10.7.5 son aproximadamente un segundo más rápidas que mi Mac 10.8.2. Los sistemas operativos más antiguos son procesadores Core 2 Duo más lentos y creo que una Mac i7 que ejecuta el sistema operativo más nuevo sería tan rápido o más rápido que el sistema operativo y la CPU más antiguos, pero me equivocaría.
Todas las máquinas realizan aproximadamente la misma cantidad de llamadas a proc_info, y todas las máquinas tienen poco tiempo de usuario para el comando, pero es posible que tenga un tiempo general más lento (y no tengo idea de por qué la suya es tan dramáticamente más lenta que mi Mountain Lion Mac).
11 pulgadas Air (i7) 2011 corriendo Mountain Lion - SSD:
MacBook Pro de 15 pulgadas con Lion Server - HDD:
IMac de 27 pulgadas con Lion - HDD:
fuente