Quá nhiều tệp đang mở - cách tìm ra thủ phạm


69

Khi chạy tail -f filename, tôi nhận được thông báo sau:

tail: inotify cannot be used, reverting to polling: Too many open files

Đó có phải là một vấn đề tiềm năng?

Làm cách nào để chẩn đoán những gì chịu trách nhiệm cho tất cả các tệp đang mở? Tôi có một danh sách các quy trình nghi ngờ, nhưng nếu chúng không trở thành thủ phạm, thì các hướng dẫn không dựa vào việc biết quy trình nào cần kiểm tra sẽ hữu ích.


1
Bạn đã tăng số lượng mô tả tập tin có sẵn thông qua ulimit?
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams Điều đó có thể hữu ích cho những người dùng khác, nhưng với tôi, nó cảm thấy giống như điều trị triệu chứng hơn là bệnh.
Andrew Grimm

Mặc dù bạn không sai, đôi khi các ứng dụng có lý do chính đáng để mở nhiều tệp.
Ignacio Vazquez-Abrams

Câu trả lời:


72

Bạn có thể sử dụng lsof để hiểu ai đang mở rất nhiều tệp. Thông thường, đó là một máy chủ (web) mở rất nhiều tệp, nhưng lsof chắc chắn sẽ giúp bạn xác định nguyên nhân.

Một khi bạn hiểu ai là kẻ xấu bạn có thể

Nếu đầu ra từ lsof khá lớn, hãy thử chuyển hướng nó đến một tệp và sau đó mở tệp

Ví dụ (bạn có thể phải Ctrl+ Clệnh đầu tiên)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

37
Dành cho người lười biếng:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itadok

1
Tôi đã nhận được cùng một lỗi và sử dụng ulimit không hoạt động. Lệnh đuôi -F vẫn trả về lỗi. Tôi đã tăng giới hạn từ 1024 lên 3000 vì vậy tôi sẽ tưởng tượng rằng mình có đủ chỗ sau đó ... Tôi đoán tôi phải khởi động lại!
Alexis Wilke

15
Tôi thấy dòng của itadok hữu ích, nhưng tôi nghĩ bạn nên sắp xếp trước (vì uniqchỉ hoạt động với các dòng liền kề), chạy uniq, sau đó sắp xếp lại. Vì vậy lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier

19
Sắp xếp và đếm lên hầu hết các tệp đang mở chắc chắn là điều tốt nhất để làm. Hiển thị tên quá trình cũng như pid: '' 'lsof | awk '{in $ 2 "" $ 1; } '| sắp xếp -rn | uniq -c | sắp xếp -rn | đầu -20 '' '
gaoithe

2
@gaoithe nếu bạn đưa ra câu trả lời, tôi sẽ vui lòng nâng cấp nó:)
Matt Ball

23

Trong trường hợp bất cứ ai khác cần nó ...

ulimit -a

Sẽ hiển thị tất cả các giới hạn hiện tại. Cụ thể ulimit -n 70000sẽ đặt giới hạn mô tả tập tin.

Cũng thế...

cat /proc/sys/fs/file-max

Sẽ hiển thị / đặt giới hạn kernel nếu được chỉnh sửa.

sudo echo 200000 > /proc/sys/fs/file-max

Một lời giải thích chi tiết hơn có thể được tìm thấy tại ...

Làm cách nào để tăng giới hạn tệp mở cho người dùng không root?


3
lo lắng là có để bạn có thể kiểm soát chặt chẽ việc sử dụng tài nguyên trong hệ thống của bạn. Tốt nhất là tăng chúng riêng lẻ cho các quy trình bạn biết sẽ cần sử dụng nhiều mô tả tệp. Bằng cách giữ chúng chặt chẽ trong kiểm tra, bạn sẽ tìm thấy các quy trình có thể rò rỉ mô tả tập tin theo thời gian. Cũng lưu ý rằng xử lý tệp được sử dụng cho mọi truy cập thiết bị trong unix / linux. ví dụ: mọi ổ cắm mạng được mở bởi một quy trình sử dụng một tệp xử lý. Điều đó giải thích tại sao bạn có thể nhấn "quá nhiều tệp đang mở" trong trường hợp tệp hệ thống tệp thông thường cũng như bất kỳ tệp thiết bị nào như kết nối mạng.
gaoithe
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.