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

24

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.)

    
posta Jason 05.02.2013 - 19:48
fonte

3 risposte

5

Come esperienza, da Mac OS X 10.7 (Lion) a 10.11.5 (EI Capitan), il lsof si blocca sempre.

Per risolvere il problema, aggiungi l'opzione -n . lsof -n

Secondo il manuale di lsof , l'opzione -n : 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'angolo in alto a destra dell'icona Ricerca Spotlight) per eseguire una "Traccia sistema" su / usr / sbin / lsof, quindi vedere le chiamate graph e sys.

    
risposta data 20.06.2016 - 11:08
fonte
3

Penso che la maggior parte del problema è che macOS sta diventando sempre più ridicolo con strati ingombranti e inutili su strati di strutture dispendiose. Ciò significa che centinaia di processi aggiuntivi e migliaia di file aggiuntivi vengono tenuti aperti, aumentando la quantità di lavoro che lsof deve fare di almeno un ordine di grandezza e forse più come due ordini.

lsof è passato da una velocità ragionevole a una atroce lente tra il 10.6 e il 10.13.

Qui su un attuale sistema 10.13.4 vedo quanto segue con solo 7 app aperte e in esecuzione (Terminale, Chrome, Calendario, 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 l'esecuzione entrambe le CPU superano del 50% il tempo di sistema

L'aggiunta di -O a volte aiuta, specialmente se lsof non è stato eseguito di recente, ma il migliore che ho visto è stato un risparmio del 10% circa. Di solito è minuscolo e probabilmente non vale i rischi descritti nella pagina di manuale:

# time lsof -lnPO | wc -l
   10994

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

dtruss afferma che ci sono oltre 89.000 chiamate a proc_info() con il mio attuale carico di processo, e quelle sono nel kernel, e come time riporta, la maggior parte del tempo trascorso è nel kernel. Non so perché ci siano circa 8 chiamate per file aperto.

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

    
risposta data 11.05.2018 - 22:39
fonte
1

Non ho una grande risposta sul perché il tuo sistema sembra richiedere un minuto di più del mio Mac più lento a chiamare proc_info 30 mila volte, ma i tuoi tempi mostrano che sia linux che OS X si trovano nell'intervallo di 10 ms per tempo utente per eseguire lsof. Puoi riprodurre l'avvio lento in modalità provvisoria per escludere altri carichi sulla tua CPU?

Ho provato tre Mac e quelli in esecuzione 10.7.5 sono circa un secondo più veloci del mio Mac 10.8.2. Il vecchio sistema operativo è più lento dei processori Core 2 Duo e penso che un Mac i7 con sistema operativo più recente sia più veloce o più veloce dei vecchi SO e CPU, ma mi sbaglierò.

Tutte le macchine producono circa lo stesso numero di chiamate proc_info, e tutte le macchine hanno un tempo di utilizzo ridotto per il comando - ma potresti avere tempi più lenti (e non ho idea del perché la tua sia così drammaticamente più lenta di my Mountain Lion Mac).

11 pollici Air (i7) 2011 che esegue 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 in esecuzione - 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

iMac da 27 pollici con Lion - 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
    
risposta data 12.02.2013 - 21:15
fonte

Leggi altre domande sui tag