Tại sao lsof trên OS X lại chậm đến mức nực cười?


36

Tôi không thể hiểu tại sao lsof trên máy Mac của tôi (10.8.2, MacBook Pro) lại chậm như vậy.

Trên máy Mac của tôi, lsofmất hơn một phút:

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

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

Trên hộp Linux điển hình, chạy Ubuntu 12.04, lsofmất 20 ms:

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

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

Vấn đề vẫn còn nếu tôi chạy lsof -n(để tránh tra cứu DNS). Hơn nữa, tôi đã thử kiểm tra xem các cuộc gọi hệ thống nào được thực hiện bằng lsofcách sử dụng dtrussvà thấy rằng nó gọi proc_infohàng chục ngàn lần:

$ 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

Có ý kiến ​​gì không? Tôi đã chạy các thử nghiệm này và thu được kết quả tương tự bằng cả phiên bản đi lsofkèm với OS X (4.85) cũng như phiên bản mới nhất từ ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ (4.87).

(Đối với người tò mò, lý do tôi thất vọng vì hiệu suất này là khi tôi kéo hình ảnh vào Evernote, nó chạy lsoftrong quá trình sao chép tệp, khiến hệ thống của tôi bị treo trong một phút mỗi khi tôi cố gắng chèn hình ảnh trong Evernote.)


1
Nếu bạn có đầu ra cho bàn điều khiển thay vì một tập tin, nó có bị treo ở một điểm cụ thể không? Tôi cũng vào ngày 10.8.2. Mất 6 giây đối với tôi và tôi nhận thấy nó bị treo mỗi khi đi được nửa chừng khi liệt kê các tệp đang mở của AirServer. Tôi đã giết AirServer và thời gian giảm xuống còn 1,76 giây. Có lẽ có một cái gì đó trên hệ thống của bạn mất nhiều thời gian để đánh giá?
Warren Pena

Điểm dữ liệu thú vị, @WarrenPena. Nếu tôi chạy lsofmà không có đối số (để liệt kê tất cả các tệp), nó sẽ bị treo trong một phút và sau đó in tất cả các tệp. Nhưng, như tôi đã đề cập, nó vẫn bị treo nếu tôi cố gắng liệt kê ai có một tệp duy nhất mở trong thư mục / tmp, vì vậy đó không phải là một tệp mở cụ thể là vấn đề. Ngoài ra, tôi không chạy bất kỳ quy trình AirServer nào.
Jason

2
Nó (chỉ?) Mất khoảng một giây cho tôi. Bạn cũng có thể thử sudo opensnoop -n lsof.
Lri

2
Phải mất 19 giây cho tôi. Không biết tại sao ...
daviewales

Ý kiến ​​hay đấy, @LauriRanta. Tôi đã thử chạy sudo opensnoop -n lsoflsof /tmp/testfiletrong hai tab, và opensnoop chỉ báo cáo rằng ba tệp đã được mở. Vì vậy, vấn đề không phải là quá nhiều tệp mở ra, mà là một cái gì đó liên quan đến proc_infocác cuộc gọi quá mức .
Jason

Câu trả lời:


10

Theo kinh nghiệm của tôi, từ Mac OS X 10.7 (Lion) đến 10.11.5 (EI Capitan), lsof luôn luôn bị treo.

Để giải quyết vấn đề, thêm -ntùy chọn.

lsof -n

Theo hướng dẫn của lsof, -ntùy chọ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: Nếu vẫn còn chậm, bạn có thể thử

-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

Cách cuối cùng để tìm hiểu lý do tại sao quá chậm là chạy công cụ "Dụng cụ" (từ góc trên bên phải biểu tượng Tìm kiếm Spotlight) để thực hiện "Truy tìm hệ thống" trên / usr / sbin / lsof sau đó xem biểu đồ và sys cuộc gọi.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


2
Ồ Thêm -ncắt giảm của tôi lsof +Dtừ 5.31 realđến 0.25 real. Tùy chọn này dành cho ... thực tế
wetjosh

2
Vẫn chậm chạp một cách lố bịch đối với tôi ...
Noldorin

Xin chào @Noldorin bạn có cùng hệ điều hành với chủ đề cũ này không? Nếu không, một câu hỏi cụ thể mới liên kết ở đây với thiết lập cụ thể và thời gian cụ thể của bạn có thể đáng để trả lời mới.
bmike

3

Tôi nghĩ phần lớn nhất của vấn đề là macOS đang trở nên lố bịch hơn bao giờ hết với các lớp phình to và không cần thiết trên các lớp khung lãng phí. Điều này có nghĩa là hàng trăm quy trình bổ sung và hàng ngàn tệp bổ sung được giữ mở, tăng số lượng công việclsof phải thực hiện ít nhất là một đơn đặt hàng lớn và có lẽ giống như hai đơn đặt hàng.

lsof đã đi từ tốc độ hợp lý đến chậm khủng khiếp trong khoảng 10,6 đến 10,13.

Ở đây trên hệ thống 10.13.4 hiện tại, tôi thấy phần sau chỉ với 7 ứng dụng mở và chạy (Terminal, Chrome, Lịch, Finder, Adium, IPGadget và Stickies). (Chrome có 7 cửa sổ, có lẽ có 10 tab mỗi cái.)

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

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

Trong quá trình chạy, cả hai CPU đều chiếm hơn 50% thời gian hệ thống

Việc thêm -Otrợ giúp đôi khi, đặc biệt là nếu lsofgần đây không được chạy, nhưng điều tốt nhất tôi thấy là tiết kiệm khoảng 10%. Thông thường nó rất nhỏ và có thể không có giá trị rủi ro được nêu trong trang hướng dẫn:

# time lsof -lnPO | wc -l
   10994

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

dtrussyêu cầu có hơn 89.000 cuộc gọi proc_info()với tải quy trình hiện tại của tôi và những cuộc gọi đó vào kernel, và như timecác báo cáo, phần lớn thời gian dành cho kernel. Tôi không biết tại sao có khoảng 8 cuộc gọi cho mỗi tệp đang mở.

Đáng buồn thay, macOS / Darwin không bao gồm fstatlệnh BSD hữu ích và hiệu quả hơn bao giờ hết .


1

Tôi không có câu trả lời tuyệt vời tại sao hệ thống của bạn dường như mất hơn một phút so với máy Mac chậm nhất của tôi để gọi proc_info30 nghìn lần, nhưng thời gian của bạn cho thấy cả linux và OS X đều nằm trong phạm vi 10 ms cho thời gian người dùng chạy lsof. Bạn có thể tái tạo thời gian khởi động chậm trong Chế độ an toàn để loại trừ các tải khác trên CPU không?

Tôi đã thử ba máy Mac và những máy chạy 10.7.5 nhanh hơn khoảng một giây so với máy Mac 10.8.2 của tôi. Hệ điều hành cũ hơn là bộ xử lý Core 2 Duo chậm hơn và tôi nghĩ rằng một máy Mac i7 chạy hệ điều hành mới hơn sẽ nhanh hơn hoặc nhanh hơn hệ điều hành và CPU cũ hơn, nhưng tôi đã nhầm.

Tất cả các máy thực hiện cùng một số lượng cuộc gọi Proc_info và tất cả các máy đều có thời gian sử dụng lệnh cho người dùng - nhưng bạn có thể có thời gian chậm hơn (và tôi không biết tại sao máy của bạn lại chậm hơn Mountain Lion của tôi Mac).

11 inch Air (i7) 2011 chạy 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 15 inch chạy 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 inch chạy 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

1
+1. Tôi đang chạy 10.8.2 trên MBP cuối năm 2010 (i7 + 8GB) và trong khi chạy một loạt ứng dụng tôi nhận được ~ 1.8 giây.
Thu hoạch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.