私はTomcat 7とJava 1.7でdebianサーバーに取り組んでいます。これは、いくつかのTCP接続、それぞれTCP接続は、Javaプロセスによって開かれたファイルです。
/proc/pid of Java/fd
を見ると、開いているファイルの数が1024を超える場合があることがわかりました。これが発生すると、catalina.out
スタックトレース_SocketException: Too many open files_
このエラーについて私が見つけたすべてのこと、人々はulimitを参照していますが、私はすでにこのことを変更しており、エラーが発生し続けます。これが設定です:
/etc/security/limits.conf
root soft nofile 8192
root hard nofile 8192
/etc/sysctl.conf
fs.file-max = 300000
ulimit -a
コマンドは以下を返します。
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
しかし、Javaプロセスの制限を確認すると、1024しかありません
/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
JavaプロセスのMax open files
の数を増やすにはどうすればよいですか?
ulimit -n 8192
catalina.sh内にあるので、catalina start
、Java上記の指定された制限で実行されます。
Ulimit値はセッションの起動時に割り当てられるため、/ etc/security/limits.confを変更しても、すでに実行中のプロセスには影響しません。非ログインプロセスは、環境変数の継承と同様に、親からulimit値を継承します。
/etc/security/limits.confを変更した後、ログアウトしてログインし(セッションに新しい制限が設定されるようにする)、アプリケーションを再起動する必要があります。そうして初めて、アプリケーションは新しい制限を使用できるようになります。
Tomcat/httpdが処理するワークロード/トラフィックによっては、ulimitを高く設定する必要はまったくないかもしれません。 Linuxはソケット接続ごとにファイル記述子を作成するため、Tomcatがmod_jk/ajpプロトコルをコネクターとして使用するように構成されている場合、許可される最大接続が高すぎるか、connectionTimeoutまたはkeepAliveTimeoutが高すぎるかを確認する必要があります。これらのパラメーターは、OSファイル記述子の消費に大きな役割を果たします。 Tomcatがリバースプロキシの前にある場合は、Apache httpd/nginx接続の数を制限することも可能です。ゲートラッシュシナリオ中に受信リクエストを抑制するために、httpdのserverLimit値を一度減らしました。結局のところ、ulimitを調整することは、システムが消費する可能性があるため、実行可能なオプションではない可能性があります。この問題を解決するには、全体的な計画を立てる必要があります。