Saya tidak tahu mengapa lsof di Mac saya (10.8.2, MacBook Pro) sangat lambat.
Di Mac saya, lsof
dibutuhkan 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, lsof
membutuhkan 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 lsof
menggunakan dtruss
, dan menemukan bahwa itu memanggil proc_info
puluhan 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 lsof
disertakan 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 lsof
dalam proses menyalin file, menyebabkan sistem saya hang selama satu menit penuh setiap kali saya mencoba untuk memasukkan gambar di Evernote.)
sumber
lsof
tanpa 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.sudo opensnoop -n lsof
.sudo opensnoop -n lsof
danlsof /tmp/testfile
dalam dua tab, dan opensnoop hanya melaporkan bahwa tiga file telah dibuka. Jadi masalahnya bukan jumlah file berlebihan yang dibuka, tetapi sesuatu yang terkait denganproc_info
panggilan berlebihan .Jawaban:
Seperti pengalaman saya, dari Mac OS X 10.7 (Lion) hingga 10.11.5 (EI Capitan),
lsof
selalu hang.Untuk mengatasi masalah, tambahkan
-n
opsi.Menurut manual
lsof
,-n
opsi:EDIT 2018-04-25: Jika masih lambat, Anda dapat mencoba
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.
sumber
-n
memotong sayalsof +D
dari5.31 real
ke0.25 real
. Opsi ini untuk ... realSaya 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
lsof
harus 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.)
Selama menjalankan kedua CPU lebih dari 50% waktu sistem
Menambahkan
-O
bantuan kadang-kadang, terutama jikalsof
belum 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:dtruss
mengklaim ada lebih dari 89.000 panggilan untukproc_info()
memuat proses saya saat ini, dan itu ke dalam kernel, dan sebagaitime
laporan, 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
fstat
perintah BSD yang lebih berguna dan efisien .sumber
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_info
30 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:
15 inci MacBook Pro menjalankan Lion Server - HDD:
IMac 27 inci menjalankan Lion - HDD:
sumber