Je n'arrive pas à comprendre pourquoi lsof sur mon Mac (10.8.2, MacBook Pro) est si lent.
Sur mon Mac, cela lsof
prend plus d'une minute:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 1m16.483s
user 0m0.029s
sys 1m15.969s
Sur une boîte Linux typique, exécutant Ubuntu 12.04, lsof
prend 20 ms:
$ touch /tmp/testfile
$ time lsof /tmp/testfile
real 0m0.023s
user 0m0.008s
sys 0m0.012s
Le problème persiste si je lance lsof -n
(pour éviter les recherches DNS). De plus, j'ai essayé de vérifier quels appels système sont effectués à l' lsof
aide de dtruss
, et j'ai constaté qu'il appelait des proc_info
dizaines de milliers de fois:
$ 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
Des idées? J'ai exécuté ces tests et obtenu les mêmes résultats en utilisant à la fois la version lsof
incluse avec OS X (4.85) ainsi que la dernière version de ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ ( 4.87 ).
(Pour les curieux, la raison pour laquelle je suis frustré par ces performances est que lorsque je fais glisser des images vers Evernote, il s'exécute lsof
en cours de copie du fichier, ce qui fait que mon système se bloque pendant une minute complète chaque fois que j'essaie d'insérer une image dans Evernote.)
lsof
sans argument (pour répertorier tous les fichiers), il se bloque pendant une minute puis imprime tous les fichiers. Mais, comme je l'ai mentionné, il se bloque toujours si j'essaie de répertorier qui a un seul fichier ouvert dans le répertoire / tmp, donc ce n'est pas un fichier ouvert particulier qui est le problème. De plus, je n'exécute aucun processus AirServer.
sudo opensnoop -n lsof
.
sudo opensnoop -n lsof
et lsof /tmp/testfile
dans deux onglets, et opensnoop a seulement signalé que trois fichiers avaient été ouverts. Donc, le problème ne doit pas être un nombre excessif de fichiers ouverts, mais quelque chose lié à des proc_info
appels excessifs .