Non riesco a capire perché lsof sul mio Mac (10.8.2, MacBook Pro) sia così lento.
Sul mio Mac, lsof
richiede più di un minuto:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 1m16.483s
user 0m0.029s
sys 1m15.969s
Su un tipico box Linux, con Ubuntu 12.04, sono lsof
necessari 20 ms:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 0m0.023s
user 0m0.008s
sys 0m0.012s
Il problema persiste se corro lsof -n
(per evitare ricerche DNS). Inoltre, ho provato a verificare quali chiamate di sistema vengono effettuate lsof
utilizzando dtruss
e ho scoperto che sta chiamando proc_info
decine di migliaia di volte:
$ 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
Qualche idea? Ho eseguito questi test e ho ottenuto gli stessi risultati utilizzando sia la versione lsof
inclusa con OS X (4.85) sia l'ultima versione da ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87).
(Per i curiosi, il motivo per cui sono frustrato da questa performance è che quando trascino le immagini su Evernote, viene eseguito lsof
il processo di copia del file, causando il blocco del sistema per un minuto intero ogni volta che provo a inserire un'immagine in Evernote.)
lsof
senza argomenti (per elencare tutti i file), si blocca per un minuto e quindi stampa tutti i file. Ma, come ho già detto, si blocca ancora se provo ad elencare chi ha un singolo file aperto nella directory / tmp, quindi non è un particolare file aperto che è il problema. Inoltre, non sto eseguendo alcun processo AirServer.
sudo opensnoop -n lsof
.
sudo opensnoop -n lsof
e lsof /tmp/testfile
in due schede, e opensnoop ha riferito solo che erano stati aperti tre file. Quindi il problema non deve essere un numero eccessivo di file aperti, ma qualcosa legato a proc_info
chiamate eccessive .