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.)
la source
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
etlsof /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é à desproc_info
appels excessifs .Réponses:
D'après mon expérience, de Mac OS X 10.7 (Lion) à 10.11.5 (EI Capitan), le
lsof
toujours se bloquer.Pour résoudre le problème, ajoutez l'
-n
option.Selon le manuel de
lsof
, l'-n
option:EDIT 2018-04-25: S'il est encore lent, vous pouvez essayer
La meilleure façon de découvrir pourquoi tant de lenteur est d'exécuter l'outil "Instruments" (à partir de l'icône de recherche Spotlight dans le coin supérieur droit) pour effectuer une "trace système" sur / usr / sbin / lsof, puis voir les appels graph et sys.
la source
-n
couper monlsof +D
bas de5.31 real
à0.25 real
. Cette option est pour ... réelJe pense que la plus grande partie du problème est que macOS devient de plus en plus ridicule avec des couches superflues et inutiles sur des couches de cadres inutiles. Cela signifie que des centaines de processus supplémentaires et des milliers de fichiers supplémentaires sont maintenus ouverts, ce qui augmente la quantité de travail
lsof
à faire d'au moins un ordre de grandeur, et peut-être plus comme deux ordres.lsof
est passé d'une vitesse raisonnable à une atrocement lente entre 10,6 et 10,13.Ici, sur un système 10.13.4 actuel, je vois ce qui suit avec seulement 7 applications ouvertes et en cours d'exécution (Terminal, Chrome, Calendrier, Finder, Adium, IPGadget et Stickies). (Chrome a 7 fenêtres, avec peut-être 10 onglets chacune.)
Pendant l'exécution, les deux CPU dépassent largement 50% du temps système
L'ajout
-O
aide parfois, surtout s'illsof
n'a pas été exécuté récemment, mais le meilleur que j'ai vu était d'environ 10% d'économies. Habituellement, il est minuscule et ne vaut probablement pas les risques décrits dans la page de manuel:dtruss
affirme qu'il y a plus de 89 000 appelsproc_info()
avec ma charge de processus actuelle, et ceux-ci sont dans le noyau, et commetime
rapports, la grande majorité du temps passé est dans le noyau. Je ne sais pas pourquoi il y a environ 8 appels par fichier ouvert.Malheureusement, macOS / Darwin n'inclut pas la
fstat
commande BSD toujours plus utile et efficace .la source
Je n'ai pas une bonne réponse pourquoi votre système semble prendre une minute de plus que mon Mac le plus lent pour appeler
proc_info
30 mille fois, mais votre timing montre que Linux et OS X sont dans la plage de 10 ms pour le temps utilisateur pour exécuter lsof. Pouvez-vous reproduire ce démarrage lent en mode sans échec pour exclure d'autres charges sur votre processeur?J'ai essayé trois Mac et ceux exécutant 10.7.5 sont environ une seconde plus rapides que mon Mac 10.8.2. Les anciens systèmes d'exploitation sont des processeurs Core 2 Duo plus lents et je pense qu'un Mac i7 exécutant le nouveau système d'exploitation serait aussi rapide ou plus rapide que les anciens systèmes d'exploitation et CPU, mais je me trompe.
Toutes les machines font à peu près le même nombre d'appels proc_info, et toutes les machines ont un temps utilisateur maigre pour la commande - mais vous pourriez être sur un timing global plus lent (et je n'ai aucune idée pourquoi le vôtre est si dramatiquement plus lent que mon Mountain Lion Mac).
11 pouces Air (i7) 2011 exécutant Mountain Lion - SSD:
MacBook Pro 15 pouces exécutant Lion Server - HDD:
IMac 27 pouces exécutant Lion - HDD:
la source