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.)
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
y lsof /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 con proc_info
llamadas excesivas .