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, lsof
mấ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, lsof
mấ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 lsof
cách sử dụng dtruss
và thấy rằng nó gọi proc_info
hà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 lsof
kè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 lsof
trong 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.)
lsof
mà 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.
sudo opensnoop -n lsof
.
sudo opensnoop -n lsof
và lsof /tmp/testfile
trong 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_info
các cuộc gọi quá mức .