Làm thế nào để theo dõi một rò rỉ mô tả tập tin?


11

Tôi có một quá trình java (Glassfish) đang rò rỉ mô tả tập tin. Tôi biết điều này bởi vì tôi nhận được java.io.IOException: Too many open filesngoại lệ hữu ích . Tôi có thể nhìn vào /proc/PID#/fdvà xem tất cả các mô tả tập tin mở. Khi tôi sử dụng lsof, tôi nhận được một số lượng lớn các mục như thế này:

java 18510 root 8811u sock 0,4 1576079 không thể xác định giao thức
java 18510 root 8812u sock 0,4 1576111 không thể xác định giao thức
java 18510 root 8813u sock 0,4 1576150 không thể xác định giao thức

Tôi thấy 12 cái mới được tạo ra mỗi phút. Tôi có thể sử dụng tùy chọn nào trên lsof hoặc những công cụ nào khác có sẵn để giúp tôi theo dõi các mô tả tệp ổ cắm nơi giao thức không thể được xác định?


//, Rất nhiều câu trả lời tuyệt vời cho câu hỏi này, nhưng một công cụ tìm kiếm sẽ truy vấn ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basan

Câu trả lời:


7

để xem 20 tệp xử lý hàng đầu bằng cách sử dụng các quy trình:

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

đầu ra ở định dạng tập tin xử lý số, pid, cmndline cho quá trình

đầu ra ví dụ

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle

4

Làm quen với lệnh strace. Nó theo dõi các cuộc gọi hệ thống. Gần đây tôi đã sử dụng nó để theo dõi các rò rỉ mô tả tập tin đã khiến cho trình nền snmpd của chúng tôi bị hỏng liên tục. Nó cần một số quen thuộc, nhưng nó là một công cụ mạnh mẽ.

Bạn có thể sử dụng strace để đính kèm vào một quy trình đang chạy (đừng quên cờ -f để theo dõi các quy trình con).


1

Chính xác thì bạn đang cố gắng theo dõi điều gì? (Các) địa chỉ IP từ xa được liên kết với các FD bị rò rỉ, mã bị lỗi hoặc một cái gì khác?

Như bạn đã xác định rằng có một rò rỉ, liên hệ với các kỹ sư chịu trách nhiệm cho quá trình java này có vẻ như là một bước tiếp theo hợp lý.


Tôi đang cố gắng theo dõi bất kỳ thông tin nào tôi có thể về những mô tả tập tin đó. can't identify protocolkhông cung cấp cho các kỹ sư nhiều để chạy với. Có công cụ hoặc tùy chọn nào trong lsof mà tôi không thấy tôi nên sử dụng không? Vấn đề không xảy ra trong env thử nghiệm và chỉ bắt đầu trong env này sau khi di chuyển nội các. Mã tương tự không có vấn đề gì trước khi di chuyển và khi táo không được triển khai, Glassfish vẫn tự rò rỉ. Dự đoán tốt nhất của tôi là một cái gì đó đã phá vỡ từ một quan điểm mạng và ổ cắm đang cố gắng khởi tạo nhưng không thể và sau đó chúng bị treo và bị bỏ lại xung quanh.
cclark
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.