2012-12-21 30 views
14

Tôi đang làm việc trên máy chủ debian với tomcat 7 và java 1.7. Đây là một ứng dụng nhận được một số kết nối TCP, mỗi kết nối TCP là một tệp mở bởi quá trình java.Quá nhiều tệp đang mở (ulimit đã thay đổi)

Nhìn vào /proc/pid of java/fd tôi thấy rằng, đôi khi, số lượng tập tin mở vượt quá 1024, khi điều này xảy ra, tôi thấy trong catalina.out log stacktrace _SocketException: Too many open files_

Tất cả những gì tôi thấy về lỗi này, mọi người tham khảo các ulimit, Tôi đã thay đổi điều này và lỗi vẫn xảy ra. Dưới đây là cấu hình:

tại /etc/security/limits.conf

root soft nofile 8192 
root hard nofile 8192 

tại /etc/sysctl.conf

fs.file-max = 300000 

lợi nhuận ulimit -a lệnh:

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 16382 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 8192 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) unlimited 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

Tuy nhiên, khi tôi kiểm tra các giới hạn của quá trình java , chỉ có 1024

tại /proc/pid of java/limits

Limit      Soft Limit   Hard Limit   Units  
Max cpu time    unlimited   unlimited   seconds 
Max file size    unlimited   unlimited   bytes  
Max data size    unlimited   unlimited   bytes  
Max stack size   8388608    unlimited   bytes  
Max core file size  0     unlimited   bytes  
Max resident set   unlimited   unlimited   bytes  
Max processes    32339    32339    processes 
Max open files   1024     1024     files  
Max locked memory   65536    65536    bytes  
Max address space   unlimited   unlimited   bytes  
Max file locks   unlimited   unlimited   locks  
Max pending signals  32339    32339    signals 
Max msgqueue size   819200    819200    bytes  
Max nice priority   0     0      
Max realtime priority  0     0      
Max realtime timeout  unlimited   unlimited   us   

Làm thế nào tôi có thể tăng số lượng Max open files cho quá trình java?

+0

Chỉ để loại trừ rõ ràng, là tomcat đang chạy dưới dạng root? – Brett

Trả lời

19

Tôi chỉ cần đặt dòng ulimit -n 8192 bên trong catalina.sh, vì vậy khi tôi thực hiện catalina start, java chạy với giới hạn được chỉ định ở trên.

+4

Bạn có thể cần phải thêm một dòng trong '/ etc/security/limits.conf' trước khi nó sẽ cho phép bạn tăng ulimit theo cách này. –

+0

Tôi nghĩ chúng ta nên tránh thay đổi catalina cho điều đó. Khi bạn sẽ nâng cấp Catalina, bạn có thể quên thay đổi này trên phiên bản mới. – mcoolive

+0

Theo như tôi đã hiểu, tệp limits.conf được PAM áp dụng khi đăng nhập.Vì vậy, có thể là nếu bạn khởi động Tomcat thông qua hệ thống init của bạn, cấu hình "giới hạn" PAM không được đặt và bạn "dự phòng" về mặc định là 1024. Bạn cần kiểm tra hướng dẫn sử dụng hệ thống init của mình cách đặt giới hạn này. Hoặc sử dụng mẹo trong câu trả lời ở đây. – Huygens

10

Giá trị ulimit được chỉ định tại thời điểm khởi động phiên, vì vậy việc thay đổi /etc/security/limits.conf sẽ không có bất kỳ tác động nào đối với các quá trình đang chạy. Các quá trình không đăng nhập sẽ kế thừa các giá trị ulimit từ cha mẹ của chúng, giống như các thừa kế của các biến môi trường.

Vì vậy, sau khi thay đổi /etc/security/limits.conf, bạn cần phải đăng xuất & thông tin đăng nhập (để phiên của bạn sẽ có giới hạn mới), sau đó khởi động lại ứng dụng. Chỉ khi đó ứng dụng của bạn mới có thể sử dụng các giới hạn mới.

1

Đặt ulimit cao hơn có thể hoàn toàn không cần thiết tùy thuộc vào khối lượng công việc/lưu lượng truy cập mà lệnh tomcat/httpd xử lý. Linux tạo ra một mô tả tập tin cho mỗi kết nối socket, vì vậy nếu tomcat được cấu hình để sử dụng giao thức mod_jk/ajp như một trình kết nối thì bạn có thể muốn xem liệu kết nối tối đa cho phép có quá cao hay không hoặc connectionTimeout hoặc keepAliveTimeout quá cao. Các tham số này đóng một vai trò rất lớn trong việc tiêu thụ các mô tả tập tin hệ điều hành. Đôi khi nó cũng có thể khả thi để hạn chế số lượng kết nối httpd/nginx apache nếu tomcat được đặt trước bởi một proxy ngược. Tôi đã từng giảm giá trị serverLimit trong httpd để điều tiết các yêu cầu đến trong kịch bản gaterush. Tất cả trong tất cả các ulimit điều chỉnh có thể không phải là một lựa chọn khả thi vì hệ thống của bạn có thể kết thúc tiêu thụ tuy nhiên nhiều bạn ném vào nó. Bạn sẽ phải đưa ra một kế hoạch tổng thể để giải quyết vấn đề này.

+0

Xin chào, xin lỗi nhưng tôi không thể tìm thấy bất kỳ thông tin hữu ích nào khác về việc này. Bạn có ý gì với 'Linux tạo ra một bộ mô tả tập tin cho mỗi kết nối socket '? Có nghĩa là "quá nhiều tệp mở" có thể do quá nhiều kết nối đến cùng một lúc không? Và đâu là cấu hình giao thức mod_jk/ajp như một kết nối? – ocramot

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