Mengapa lsof pada OS X sangat lambat?

36

Saya tidak tahu mengapa lsof di Mac saya (10.8.2, MacBook Pro) sangat lambat.

Di Mac saya, lsofdibutuhkan lebih dari satu menit:

$ touch /tmp/testfile
$ time lsof /tmp/testfile

real   1m16.483s
user   0m0.029s
sys    1m15.969s

Pada kotak Linux yang khas, menjalankan Ubuntu 12.04, lsofmembutuhkan waktu 20 ms:

$ touch /tmp/testfile
$ time lsof /tmp/testfile

real   0m0.023s
user   0m0.008s
sys    0m0.012s

Masalahnya tetap ada jika saya menjalankan lsof -n(untuk menghindari pencarian DNS). Selanjutnya, saya mencoba memeriksa panggilan sistem mana yang dibuat dengan lsofmenggunakan dtruss, dan menemukan bahwa itu memanggil proc_infopuluhan ribu kali:

$ 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

Ada ide? Saya sudah menjalankan tes ini dan mendapatkan hasil yang sama menggunakan versi yang lsofdisertakan dengan OS X (4.85) serta versi terbaru dari ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4,87).

(Untuk yang penasaran, alasan saya frustrasi dengan kinerja ini adalah ketika saya menyeret gambar ke Evernote, itu berjalan lsofdalam proses menyalin file, menyebabkan sistem saya hang selama satu menit penuh setiap kali saya mencoba untuk memasukkan gambar di Evernote.)

Jason
sumber
1
Jika Anda memiliki output ke konsol bukan file, apakah itu menggantung pada titik tertentu? Saya juga di 10.8.2. Butuh 6 detik bagi saya, dan saya perhatikan itu tergantung setiap kali setengah dari daftar file terbuka AirServer. Saya membunuh AirServer, dan waktu turun menjadi 1,76s. Mungkin ada sesuatu di sistem Anda yang perlu waktu lama untuk dievaluasi?
Warren Pena
Titik data yang menarik, @ WarrenPena. Jika saya menjalankan lsoftanpa argumen (untuk daftar semua file), hang selama satu menit dan kemudian mencetak semua file. Tetapi, seperti yang saya sebutkan, itu masih hang jika saya mencoba daftar siapa yang memiliki satu file terbuka di direktori / tmp, jadi itu bukan file terbuka tertentu yang menjadi masalah. Juga, saya tidak menjalankan proses AirServer.
Jason
2
(Hanya?) Butuh sekitar satu detik untuk saya. Anda juga bisa mencoba sudo opensnoop -n lsof.
Lri
2
Butuh 19 detik untuk saya. Tidak tahu mengapa ...
daviewales
Ide bagus, @LauriRanta. Saya mencoba menjalankan sudo opensnoop -n lsofdan lsof /tmp/testfiledalam dua tab, dan opensnoop hanya melaporkan bahwa tiga file telah dibuka. Jadi masalahnya bukan jumlah file berlebihan yang dibuka, tetapi sesuatu yang terkait dengan proc_infopanggilan berlebihan .
Jason

Jawaban:

10

Seperti pengalaman saya, dari Mac OS X 10.7 (Lion) hingga 10.11.5 (EI Capitan), lsofselalu hang.

Untuk mengatasi masalah, tambahkan -nopsi.

lsof -n

Menurut manual lsof, -nopsi:

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: Jika masih lambat, Anda dapat mencoba

-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

Cara utama untuk mengetahui mengapa sangat lambat adalah dengan menjalankan alat "Instruments" (dari sudut kanan atas ikon Spotlight Search) untuk melakukan "System Trace" pada / usr / sbin / lsof kemudian lihat grafik dan panggilan sistem.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

osexp2003
sumber
2
Wow! Menambahkan -nmemotong saya lsof +Ddari 5.31 realke 0.25 real. Opsi ini untuk ... real
wetjosh
2
Masih sangat lambat bagi saya ...
Noldorin
Hai @Noldorin, apakah Anda berada di os yang sama dengan utas lama ini? Jika tidak, pertanyaan spesifik baru yang menghubungkan di sini dengan pengaturan spesifik Anda dan waktu spesifik mungkin layak untuk jawaban baru.
bmike
3

Saya pikir bagian terbesar dari masalah ini adalah bahwa macOS menjadi semakin konyol dengan lapisan-lapisan yang menggembung dan tidak perlu pada lapisan kerangka kerja yang boros. Ini berarti ratusan proses ekstra dan ribuan file tambahan ditahan secara terbuka, meningkatkan jumlah pekerjaan yang lsofharus dilakukan dengan setidaknya urutan besarnya, dan mungkin lebih seperti dua pesanan.

lsof berubah dari kecepatan yang wajar menjadi sangat lambat antara 10,6 dan 10,13.

Di sini, pada sistem 10.13.4 saat ini saya melihat yang berikut ini dengan hanya 7 aplikasi terbuka dan berjalan (Terminal, Chrome, Kalender, Finder, Adium, IPGadget, dan Stickies). (Chrome memiliki 7 jendela, dengan masing-masing 10 tab.)

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

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

Selama menjalankan kedua CPU lebih dari 50% waktu sistem

Menambahkan -Obantuan kadang-kadang, terutama jika lsofbelum dijalankan akhir-akhir ini, tetapi yang terbaik yang saya lihat adalah penghematan sekitar 10%. Biasanya itu sangat kecil dan kemungkinan tidak sebanding dengan risiko yang diuraikan di halaman manual:

# time lsof -lnPO | wc -l
   10994

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

dtrussmengklaim ada lebih dari 89.000 panggilan untuk proc_info()memuat proses saya saat ini, dan itu ke dalam kernel, dan sebagai timelaporan, sebagian besar waktu yang dihabiskan ada di dalam kernel. Saya tidak tahu mengapa ada sekitar 8 panggilan per file terbuka.

Sayangnya macOS / Darwin tidak menyertakan fstatperintah BSD yang lebih berguna dan efisien .

Greg A. Woods
sumber
1

Saya tidak punya jawaban yang bagus mengapa sistem Anda tampaknya membutuhkan waktu satu menit lebih lama daripada Mac saya yang paling lambat untuk menelepon proc_info30 ribu kali, tetapi waktu Anda menunjukkan bahwa baik linux dan OS X berada dalam kisaran 10 ms untuk waktu pengguna untuk menjalankan lsof. Bisakah Anda mereproduksi waktu boot yang lambat dalam Safe Mode untuk menyingkirkan beban lain pada CPU Anda?

Saya sudah mencoba tiga Mac dan yang menjalankan 10.7.5 sekitar satu detik lebih cepat daripada 10.8.2 Mac saya. OS lama lebih lambat prosesor Core 2 Duo dan saya pikir i7 Mac menjalankan OS yang lebih baru akan lebih cepat atau lebih cepat daripada OS dan CPU yang lebih tua, tapi saya akan salah.

Semua mesin menghasilkan jumlah panggilan proc_info yang sama, dan semua mesin memiliki waktu pengguna yang ramping untuk perintah - tetapi Anda mungkin menggunakan waktu keseluruhan yang lebih lambat (dan saya tidak tahu mengapa Anda secara dramatis lebih lambat daripada Mountain Lion saya. Mac).

11 inch Air (i7) 2011 menjalankan 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 

15 inci MacBook Pro menjalankan 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

IMac 27 inci menjalankan 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
bmike
sumber
1
+1. Saya menjalankan 10.8.2 pada akhir-2010 MBP (i7 + 8GB), dan saat menjalankan banyak aplikasi saya mendapatkan ~ 1.8s.
Harv