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 una tipica macchina Linux, con Ubuntu 12.04, lsof
impiega 20 ms:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 0m0.023s
user 0m0.008s
sys 0m0.012s
Il problema persiste se eseguo lsof -n
(per evitare ricerche DNS). Inoltre, ho provato a verificare quali chiamate di sistema sono state fatte da lsof
usando dtruss
, e ho scoperto che chiama 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 ottenuto gli stessi risultati utilizzando sia la versione di lsof
inclusa con OS X (4.85), sia l'ultima versione da ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87).
(Per i curiosi, la ragione per cui sono frustrato da questa performance è che quando trascino le immagini su Evernote, esegue lsof
nel processo di copia del file, facendo sì che il mio sistema si blocchi per un minuto intero ogni volta Cerco di inserire un'immagine in Evernote.)