ทำไม lsof บน OS X จึงช้าอย่างน่าขัน?


36

ฉันหาสาเหตุไม่ได้บน Mac ของฉัน (10.8.2, MacBook Pro) ช้ามาก

ใน Mac ของฉันlsofใช้เวลามากกว่าหนึ่งนาที:

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

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

บนกล่อง Linux ทั่วไปที่ใช้งาน Ubuntu 12.04 lsofจะใช้เวลา 20 ms:

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

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

ปัญหายังคงมีอยู่ถ้าฉันเรียกใช้lsof -n(เพื่อหลีกเลี่ยงการค้นหา DNS) ต่อไปฉันลองตรวจสอบว่าการโทรของระบบใดที่lsofใช้โดยใช้dtrussและพบว่ามันกำลังเรียกproc_infoนับหมื่นครั้ง:

$ 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

ความคิดใด ๆ ฉันใช้การทดสอบเหล่านี้และได้ผลลัพธ์เดียวกันโดยใช้ทั้งเวอร์ชันที่lsofรวมอยู่ใน OS X (4.85) รวมถึงเวอร์ชันล่าสุดจากftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87)

(สำหรับคนที่อยากรู้อยากเห็นเหตุผลที่ฉันรู้สึกผิดหวังกับประสิทธิภาพการทำงานนี้คือเมื่อฉันลากภาพไปที่ Evernote มันจะทำงานlsofในกระบวนการคัดลอกไฟล์ทำให้ระบบของฉันหยุดทำงานเต็มนาทีทุกครั้งที่ฉันพยายามแทรกภาพ ใน Evernote)


1
หากคุณให้มันส่งออกไปยังคอนโซลแทนไฟล์มันจะแขวนที่จุดใด? ฉันยังอยู่ที่ 10.8.2 ฉันใช้เวลา 6 วินาทีและฉันสังเกตเห็นว่ามันค้างทุกครึ่งทางผ่านรายการไฟล์ที่เปิดของ AirServer ฉันฆ่า AirServer และเวลาลดลงเหลือ 1.76 วินาที อาจมีบางอย่างในระบบของคุณที่ใช้เวลานานในการประเมิน?
Warren Pena

จุดข้อมูลที่น่าสนใจ @WarrenPena ถ้าฉันรันlsofโดยไม่มีข้อโต้แย้ง (เพื่อแสดงรายการไฟล์ทั้งหมด) มันจะหยุดทำงานหนึ่งนาทีแล้วพิมพ์ไฟล์ทั้งหมด แต่อย่างที่ฉันบอกไปมันยังคงแฮงค์ถ้าฉันพยายามที่จะแสดงรายการผู้ที่มีไฟล์เดียวเปิดในไดเรกทอรี / tmp ดังนั้นจึงไม่ใช่ไฟล์เปิดเฉพาะที่เป็นปัญหา นอกจากนี้ฉันไม่ได้ใช้กระบวนการ AirServer ใด ๆ
เจสัน

2
มันใช้เวลาประมาณหนึ่งวินาทีสำหรับฉัน sudo opensnoop -n lsofนอกจากนี้คุณยังสามารถลอง
Lri

2
ใช้เวลา 19 วินาทีสำหรับฉัน ไม่รู้เลยว่าทำไม ...
daviewales

ความคิดที่ดี @LauriRanta ฉันพยายามเรียกใช้sudo opensnoop -n lsofและlsof /tmp/testfileในสองแท็บและ opensnoop รายงานเพียงว่ามีสามไฟล์ที่ถูกเปิด ดังนั้นปัญหาต้องไม่เปิดเกินจำนวนไฟล์ แต่สิ่งที่เกี่ยวข้องกับการproc_infoโทรมากเกินไป
เจสัน

คำตอบ:


10

จากประสบการณ์ของฉันตั้งแต่ Mac OS X 10.7 (Lion) ถึง 10.11.5 (EI Capitan) ผู้ที่lsofแขวนอยู่เสมอ

หากต้องการแก้ไขปัญหาให้เพิ่ม-nตัวเลือกต่อท้าย

lsof -n

ตามคู่มือการใช้งานlsofที่-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

แก้ไข 2018-04-25: หากยังช้าคุณสามารถลอง

-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

วิธีที่ดีที่สุดในการค้นหาสาเหตุที่ช้าคือการเรียกใช้เครื่องมือ "เครื่องมือ" (จากมุมบนขวาของไอคอนค้นหา Spotlight) เพื่อทำ "การติดตามระบบ" บน / usr / sbin / lsof จากนั้นดูกราฟและการเรียก sys

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


2
ว้าว! การเพิ่ม-nตัดของฉันlsof +Dลดลงจากการ5.31 real 0.25 realตัวเลือกนี้ใช้สำหรับ ... ของจริง
wetjosh

2
ยังคงขันช้าสำหรับฉัน ...
Noldorin

สวัสดี @Noldorin คุณอยู่ในระบบเดียวกันกับเธรดที่เก่ากว่านี้ไหม? หากไม่มีคำถามเฉพาะใหม่ที่เชื่อมโยงที่นี่กับการตั้งค่าเฉพาะของคุณและช่วงเวลาเฉพาะอาจคุ้มค่ากับคำตอบใหม่
bmike

3

ฉันคิดว่าส่วนที่ใหญ่ที่สุดของปัญหาคือ macOS กำลังกลายเป็นเรื่องไร้สาระยิ่งขึ้นด้วยชั้นบวมและชั้นที่ไม่จำเป็นบนชั้นของกรอบที่สิ้นเปลือง สิ่งนี้มีความหมายว่ากระบวนการพิเศษหลายร้อยรายการและไฟล์พิเศษหลายพันรายการที่ถูกเปิดไว้ทำให้การเพิ่มจำนวนงานlsofต้องทำอย่างน้อยลำดับความสำคัญและอาจมากกว่าสองคำสั่ง

lsof เปลี่ยนจากความเร็วที่เหมาะสมไปอย่างช้าๆระหว่าง 10.6 และ 10.13

ที่นี่ในระบบ 10.13.4 ปัจจุบันฉันเห็นสิ่งต่อไปนี้โดยมีเพียง 7 แอปที่เปิดและใช้งาน (เทอร์มินัล, Chrome, ปฏิทิน, Finder, Adium, IPGadget และ Stickies) (Chrome มี 7 หน้าต่างซึ่งอาจมี 10 แท็บแต่ละแท็บ)

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

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

ในระหว่างการรันทั้งสองซีพียูจะมีเวลาของระบบมากกว่า 50%

การเพิ่มความ-Oช่วยเหลือบางครั้งโดยเฉพาะอย่างยิ่งหากlsofไม่ได้รับการเรียกใช้เมื่อเร็ว ๆ นี้ แต่สิ่งที่ดีที่สุดที่ฉันเคยเห็นคือการประหยัด 10% โดยปกติแล้วจะมีขนาดเล็กและอาจไม่คุ้มกับความเสี่ยงที่ระบุไว้ในหน้าคู่มือ:

# time lsof -lnPO | wc -l
   10994

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

dtrussอ้างว่ามีการเรียกใช้มากกว่า 89,000 ครั้งเมื่อproc_info()โหลดกระบวนการปัจจุบันของฉันและสิ่งเหล่านั้นลงในเคอร์เนลและตามtimeรายงานเวลาส่วนใหญ่ที่ใช้ในเคอร์เนล ฉันไม่รู้ว่าทำไมมีประมาณ 8 สายต่อไฟล์ที่เปิดอยู่

น่าเศร้า macOS / ดาร์วินไม่ได้รวมfstatคำสั่งBSD ที่มีประโยชน์และมีประสิทธิภาพมากขึ้น


1

ฉันไม่มีคำตอบที่ดีว่าทำไมระบบของคุณใช้เวลานานกว่า Mac ที่ช้าที่สุดของฉันในการโทรถึงproc_info30,000 ครั้ง แต่เวลาของคุณแสดงให้เห็นว่าทั้ง linux และ OS X อยู่ในช่วง 10 ms เพื่อให้ผู้ใช้เรียกใช้ lsof คุณสามารถสร้างการบูทเวลาที่ช้าในเซฟโหมดเพื่อแยกแยะโหลดอื่น ๆ บน CPU ของคุณได้หรือไม่?

ฉันลอง Macs สามเครื่องและตัวที่รัน 10.7.5 นั้นเร็วกว่า Mac ของฉันที่ 10.8.2 ประมาณหนึ่งวินาที ระบบปฏิบัติการรุ่นเก่านั้นช้ากว่าโปรเซสเซอร์ Core 2 Duo และฉันคิดว่า i7 Mac ที่ใช้ระบบปฏิบัติการรุ่นใหม่นั้นจะเร็วหรือเร็วกว่าระบบปฏิบัติการและ CPU รุ่นเก่า แต่ฉันคิดผิด

เครื่องจักรทุกเครื่องมีการเรียกหมายเลข proc_info เท่ากันและเครื่องทั้งหมดมีเวลาผู้ใช้น้อยสำหรับคำสั่ง - แต่คุณอาจต้องใช้เวลาโดยรวมที่ช้าลง (และฉันไม่มีเงื่อนงำว่าทำไมคุณถึงช้ากว่า Mountain Lion ของฉันอย่างมาก Mac)

11 นิ้ว Air (i7) 2011 ทำงาน 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 นิ้ว MacBook Pro ที่ใช้ 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 รุ่น Lion ขนาด 27 นิ้ว - 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 ฉันกำลังใช้งาน 10.8.2 ในช่วงปลายปี 2010 MBP (i7 + 8GB) และในขณะที่ใช้งานแอพจำนวนมากที่ฉันได้รับ ~ 1.8s
Harv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.