Perché lsof su OS X è così ridicolmente lento?


36

Non riesco a capire perché lsof sul mio Mac (10.8.2, MacBook Pro) sia così lento.

Sul mio Mac, lsofrichiede 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 lsofnecessari 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 lsofutilizzando dtrusse ho scoperto che sta chiamando proc_infodecine 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 lsofinclusa 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 lsofil processo di copia del file, causando il blocco del sistema per un minuto intero ogni volta che provo a inserire un'immagine in Evernote.)


1
Se l'output è nella console anziché in un file, si blocca in un determinato punto? Sono anche il 10.8.2. Ci sono voluti 6 secondi per me e ho notato che era sospeso ogni volta a metà dell'elenco dei file aperti di AirServer. Ho ucciso AirServer e il tempo è sceso a 1,76 secondi. Forse c'è qualcosa nel tuo sistema che impiega molto tempo per valutare?
Warren Pena,

Punto dati interessante, @WarrenPena. Se corro lsofsenza 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.
Jason,

2
(Solo?) Ci vuole circa un secondo per me. Potresti anche provare sudo opensnoop -n lsof.
Lri,

2
Ci vogliono 19 secondi per me. Non
ho

Buona idea, @LauriRanta. Ho provato a correre sudo opensnoop -n lsofe lsof /tmp/testfilein 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_infochiamate eccessive .
Jason,

Risposte:


10

Come mia esperienza, da Mac OS X 10.7 (Lion) a 10.11.5 (EI Capitan), lsofsi blocca sempre.

Per risolvere il problema, aggiungere l' -nopzione.

lsof -n

Secondo il manuale di lsof, l' -nopzione:

inhibits the conversion of network numbers to host names for network files.  
Inhibiting conversion may make  lsof  run faster.  It is also useful when host 
name lookup is not working properly

EDIT 2018-04-25: Se è ancora lento, puoi provare

-O to bypass  the  strategy it uses to avoid being blocked by some kernel operations
-P to inhibits the conversion of port numbers to port names for network files
-l to inhibits  the  conversion of user ID numbers to login names

Il modo migliore per scoprire perché è così lento è eseguire lo strumento "Strumenti" (dall'icona di ricerca Spotlight nell'angolo in alto a destra) per eseguire una "Traccia di sistema" su / usr / sbin / lsof, quindi vedere il grafico e le chiamate sys.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


2
Wow! Aggiungendo -ntagliare il mio lsof +Dda 5.31 reala 0.25 real. Questa opzione è per ... real
wetjosh il

2
Ancora ridicolmente lento per me ...
Noldorin,

Ciao @Noldorin sei sullo stesso sistema operativo di questo thread più vecchio? In caso contrario, una nuova domanda specifica che collega qui con la configurazione specifica e i tempi specifici potrebbe valere una nuova risposta.
bmike

3

Penso che la parte più grande del problema sia che macOS sta diventando sempre più ridicolo con strati gonfi e inutili su strati di framework dispendiosi. Ciò ha significato l'apertura di centinaia di processi extra e migliaia di file extra, aumentando la quantità di lavoro lsofda svolgere almeno per un ordine di grandezza e forse più come due ordini.

lsof è passato da una velocità ragionevole a un rallentamento atrocemente tra 10.6 e 10.13.

Qui su un sistema 10.13.4 attuale vedo quanto segue con solo 7 app aperte e funzionanti (Terminal, Chrome, Calendar, Finder, Adium, IPGadget e Stickies). (Chrome ha 7 finestre, con forse 10 schede ciascuna.)

# ps ax | wc -l
     401
# time lsof -lnP | wc -l
   10976

real    0m49.684s
user    0m0.250s
sys 0m40.172s

Durante il funzionamento entrambe le CPU superano il 50% del tempo di sistema

L'aggiunta -Oaiuta a volte, soprattutto se lsofnon è stata eseguita di recente, ma il migliore che ho visto è stato di circa il 10% di risparmio. Di solito è minuscolo e probabilmente non vale i rischi indicati nella pagina del manuale:

# time lsof -lnPO | wc -l
   10994

real    0m47.482s
user    0m0.249s
sys 0m40.472s

dtrussafferma che ci sono oltre 89.000 chiamate a proc_info()cui si timeriferisce il mio attuale processo di caricamento, e quelle sono nel kernel, e come riferito, la maggior parte del tempo speso è nel kernel. Non so perché ci siano circa 8 chiamate per file aperto.

Purtroppo macOS / Darwin non include il fstatcomando BSD sempre più utile ed efficiente .


1

Non ho una grande risposta sul perché il tuo sistema sembra impiegare un minuto in più rispetto al mio Mac più lento per chiamare proc_info30 mila volte, ma i tuoi tempi mostrano che sia Linux che OS X sono nell'intervallo di 10 ms per consentire all'utente di eseguire lsof. Riesci a riprodurre quel rallentamento dell'avvio in modalità provvisoria per escludere altri carichi sulla tua CPU?

Ho provato tre Mac e quelli con 10.7.5 sono circa un secondo più veloci del mio Mac 10.8.2. I sistemi operativi precedenti sono processori Core 2 Duo più lenti e penso che un Mac i7 che esegue il sistema operativo più recente sarebbe più veloce o più veloce dei sistemi operativi e della CPU precedenti, ma mi sbaglierei.

Tutte le macchine effettuano lo stesso numero di chiamate proc_info e tutte le macchine hanno un tempo limitato per l'utente per il comando - ma potresti essere su un tempismo generale più lento (e non ho idea del perché il tuo sia così drammaticamente più lento del mio Mountain Lion Mac).

11 pollici Air (i7) 2011 in esecuzione Mountain Lion - SSD:

$ system_profiler SPSoftwareDataType
      System Version: OS X 10.8.2 (or something)
      Kernel Version: Darwin 12.3.0
      Secure Virtual Memory: Enabled
$ time lsof /tmp/testfile 

real    0m1.179s
user    0m0.012s
sys     0m1.158s
$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | sort | uniq -c | sort -nr | head
9310 proc_info(0x2, 0x68, 0x8)           = 1272 0
1220 proc_info(0x2, 0xCEB6, 0x8)                 = 1272 0
$ cat /tmp/dump | cut -c -9 | sort | uniq -c | sort -nr | head
30884 proc_info
 116 write(0x4
  87 read(0x5,
  60 sigaction
  60 setitimer
  35 stat64("/
  30 sigprocma
  30 sigaltsta
  21 close(0x3
  18 close(0x6 

MacBook Pro da 15 pollici con Lion Server - HDD:

$ system_profiler SPSoftwareDataType
      System Version: Mac OS X Server 10.7.5 (11G63)
      Kernel Version: Darwin 11.4.2
$ time lsof /tmp/testfile

real    0m0.329s
user    0m0.005s
sys     0m0.324s

Lion in esecuzione iMac da 27 pollici - HDD:

$ system_profiler SPSoftwareDataType
      System Version: Mac OS X 10.7.5 (11G63b)
      Kernel Version: Darwin 11.4.2
$ time lsof /tmp/testfile

real    0m0.066s
user    0m0.002s
sys     0m0.065s
$ sudo dtruss lsof /tmp/testfile 2> /tmp/dump
$ cat /tmp/dump | cut -c -9 | sort | uniq -c | sort -nr | head
23034 proc_info
 188 write(0x4
 141 read(0x5,
  96 sigaction
  96 setitimer
  48 sigprocma
  48 sigaltsta
  31 stat64("/
  21 close(0x3
  18 close(0x6

1
+1. Sto eseguendo il 10.8.2 su un MBP di fine 2010 (i7 + 8GB), e mentre eseguo un sacco di app ottengo ~ 1.8s.
Harv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.