2014-04-29 17 views
5

Tôi có một chương trình Java sẽ phát sinh lỗi 'Quá nhiều tệp đang mở' sau khi chạy trong khoảng 3 phút. Việc tăng giới hạn tệp mở không hoạt động, vì nó vẫn sử dụng hết tất cả giới hạn, chỉ chậm hơn. Vì vậy, có một cái gì đó sai trái với chương trình của tôi và tôi cần phải tìm hiểu.Linux - "Quá nhiều tệp đang mở" với đường ống, cách gỡ lỗi

Đây là những gì tôi đã làm, 10970 là pid

  • Kiểm tra mở file của quá trình Java sử dụng cat /proc/10970/fd và tìm hiểu hầu hết trong số đó là ống
  • Sử dụng lsof -p 10970 | grep FIFO để liệt kê tất cả các đường ống và tìm khoảng 450 ống
  • ống trông giống như dưới đây

java 10.970 dịch vụ 1w FIFO 0,8 0t0 5890 ống

java 10.970 dịch vụ 2w FIFO 0,8 0t0 5890 ống

java 10.970 dịch vụ 169r FIFO 0,8 0t0 2.450.696 ống

java 10.970 dịch vụ 201r FIFO 0,8 0t0 2.450.708 ống

Nhưng tôi không biết cách tiếp tục. 0,8 trong đầu ra ở trên có nghĩa là số thiết bị. Làm thế nào tôi có thể tìm thấy các thiết bị với những con số này?

Cập nhật

Chương trình này là một máy chủ TCP và nhận các kết nối socket từ tin nhắn của khách hàng và chế biến. Tôi có hai môi trường. Trong môi trường sản xuất nó hoạt động tốt, nhưng trong môi trường thử nghiệm nó có vấn đề này gần đây. Trong môi trường sản xuất, tôi không thấy nhiều ống. Mã và cơ sở hạ tầng của hai môi trường này giống nhau, cả hai đều được quản lý bởi Chef.

+3

Câu hỏi này là mơ hồ. Chương trình của bạn làm gì? Ngoài ra, bạn có đóng "kết nối" của mình bằng bất kỳ cơ hội nào không? –

Trả lời

1

Nhưng tôi không biết cách tiếp tục.

Điều bạn cần làm là xác định địa điểm hoặc địa điểm trong mã Java nơi bạn đang mở các đường ống này ... và đảm bảo rằng chúng luôn đóng khi bạn hoàn tất.

Cách tốt nhất để đảm bảo rằng các ống được đóng lại là đóng chúng một cách rõ ràng khi bạn hoàn thành chúng. Ví dụ (sử dụng đầu vào suối thay vì ổ cắm ...):

InputStream is = new FileInputStream("somefile.txt"); 
    try { 
     // Use file 
    } finally { 
     is.close(); 
    } 

Trong Java 7 trở lên, bạn có thể viết rằng ngày càng ngắn gọn càng ///

try (InputStream is = new FileInputStream("somefile.txt")) { 
     // Use file 
    } 

Trong trường hợp sau, các InputStream object được tự động đóng lại khi try hoàn thành ... trong một khối finally tiềm ẩn.


0,8 trong đầu ra ở trên có nghĩa là số thiết bị. Làm thế nào tôi có thể tìm thấy các thiết bị với những con số này?

Điều đó có thể không liên quan để giải quyết vấn đề. Tập trung vào lý do tại sao các bộ mô tả tập tin không bị đóng. Việc biết số điện thoại có nghĩa là gì không giúp ích gì.

Trong môi trường sản xuất Tôi không thấy quá nhiều ống.

Đó cũng có thể là thuật ngữ đỏ. Nó có thể được gây ra bởi GC chạy thường xuyên hơn, và đóng các mô tả tập tin mồ côi trước khi trở thành một vấn đề.

(Nhưng buộc GC để chạy không phải là một giải pháp. Bạn không nên dựa vào GC để đóng file descriptor. Đó là không hiệu quả và đáng tin cậy.)

+0

Làm cách nào để biết phương thức java nào tạo đường ống linux? – fiddler

Các vấn đề liên quan