thay thế không thâm dụng cpu cho lsof?


12

Chúng tôi chạy một cụm Apache Cassandra trong đó mỗi máy chủ có vài trăm nghìn tệp được mở tại bất kỳ thời điểm nào.

Chúng tôi muốn có thể nhận được số lượng tệp đang mở theo chu kỳ và đưa số này vào than chì , nhưng khi chúng tôi chạy lsoftheo collectd, cuối cùng phải mất vài phút để hoàn thành và nhai một lượng CPU không phù hợp trong thời gian đó .

Tôi đang tự hỏi liệu có một phương tiện thay thế và thân thiện hơn để nhận cùng một dữ liệu mà lsof cung cấp hay thậm chí là một cách chạy lsof không ăn vào CPU một cách đáng chú ý? (Mặc dù tôi cho rằng phương pháp sau này có thể sẽ mất nhiều thời gian hơn để hoàn thành so với hiện tại ... không lý tưởng).

Có lẽ kernel duy trì một số biến ở đâu đó có chứa số lượng tệp đang mở? Suy nghĩ viển vông?

Cập nhật:

Để trả lời một trong những câu trả lời, chúng tôi đã sử dụng -b-ncờ. Đây là lệnh đầy đủ khi tôi chạy nó collectd:

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l

Câu trả lời:


12

Bạn có thể không cần phải giải quyết các địa chỉ mạng cho ổ cắm, vì vậy ít nhất hãy sử dụng công -ntắc. Sau đó, bạn cũng có thể muốn bỏ qua các hoạt động chặn với -b.

Hai công tắc đầu tiên nên thực sự làm cho nó nhanh hơn.

Và sau đó -lđể tránh giải quyết uids. Và -Lđể tránh đếm liên kết. V.v. Xem người đàn ông lsof .

Ngoài ra, với Linux, bạn có thể tạo một tập lệnh để chỉ cần đếm các liên kết /proc/<PID>/fdnhư thế này:

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'


Tôi luôn luôn nhận - tìm: /proc/{{number}}/fd/5': No such file or directory find: / Proc / {{number}} / fdinfo / 5 ': Không có tệp hoặc thư mục như vậy - Q @ Benoît làm cách nào để tránh điều đó?
BG Bruno

2
@BrunoBG: thử:echo /proc/*/fd/* | wc -w
Olivier Dulac

Thx @OlivierDulac đó là một điều hiển nhiên :-)
BG Bruno

đề xuất tốt, nhưng đã sử dụng các tùy chọn -n và -b .... Tôi cần thêm đề xuất
Michael Martinez

1
@OlivierDulac có thể không hoạt động nếu bạn có số lượng fd rất lớn.
Benoît

5

Bạn đang làm sai.

Từ man proc

   /proc/sys/fs/file-nr

Tệp này (chỉ đọc) chứa ba số: số lượng tệp được phân bổ (nghĩa là số lượng tệp hiện được mở); số lượng tập tin xử lý miễn phí; và số lượng xử lý tệp tối đa (nghĩa là cùng giá trị với / Proc / sys / fs / file-max). Nếu số lượng xử lý tệp được phân bổ gần với mức tối đa, bạn nên xem xét tăng mức tối đa. Trước Linux 2.6, tệp được cấp phát kernel xử lý linh hoạt, nhưng nó không giải phóng chúng một lần nữa. Thay vào đó, các thẻ xử lý tệp miễn phí được giữ trong một danh sách để phân bổ lại; giá trị "xử lý tệp miễn phí" cho biết kích thước của danh sách đó. Một số lượng lớn các thẻ xử lý tệp miễn phí cho biết rằng đã có một đỉnh quá khứ trong việc sử dụng các thẻ xử lý tệp mở. Kể từ Linux 2.6, kernel không xử lý các tệp xử lý được giải phóng và "

Giá trị đầu tiên nếu con mèo cung cấp cho bạn chính xác bạn là gì sau khi nó xuất hiện.

Đối với bản ghi, tôi không thể lấy lsofđầu ra khớp với nó ngay cả với một số lượng lỗi nhưng tôi thu thập nếu đó là những gì mà kernel nói có thẩm quyền hơn danh sách bạn nhận được từ lsofdù sao.


1
Đây là đầu ra lsof của tôi : [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065. Đây là những gì file-nr nói : [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428. Sự khác biệt lớn (1.000.000+ so với 2784) là do thực tế lsofbao gồm tất cả những thứ không có mô tả tệp được liên kết với chúng: tệp thư viện, tệp thực thi, v.v. Vì vậy, nếu bạn chỉ quan tâm đến mô tả tệp, thì file-nrlà con đường để đi, nếu không bạn cần lsof hoặc tương đương.
Michael Martinez

inode-nrThay vào đó hãy thử ở cùng một vị trí.
Matthew Ife
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.