この問題は、現在ノードサーバー(コンパクト)とSpring Boot Javaサーバー(ジョブ)を実行している本番Ubuntuシステムで2回発生しました。最初にこのようなことが起こったとき、私のサーバーがダウンしてファイルの/proc/sys/fs/file-max
値808286
が私にとって完全に合理的だと思いましたが、とにかく値を増やし、2097152
その後何をしたのか覚えていませんでした(数年前は良いことでした)。その頃? )しかし、おそらくサーバーを再起動するか、少なくとも私のサービスを再起動すると問題が解決します。今日は私をいじめるためにまた来ました。 Javaサービスを再起動すると問題が一時的に解決されましたが、今後はこのような状況を避けるために何が起こったのかを知りたいと思います。
/etc/security/limits.conf
このファイルはUbuntuインストールのデフォルト値なので、コメントファイルにすぎず、ここで再現する必要はありません。- Javaサービスはユーザーによって実行されます
tomcat
。 - Apacheはによって実行されます
root
。これにより、ノードまたは Spring Boot サービスにトラフィックが転送されます。
私のシステムでいくつかの関連コマンドの結果...
$ ulimit -Sn
1024
$ ulimit -Hn
1048576
$ sudo su tomcat
$ ulimit -Sn
1024
$ ulimit -Hn
1048576
追加の質問、なぜ私のハード制限がありますか?半分/proc/sys/fs/file-max
?に設定された値
ところで、プロセスごとの制限を見てみると、次のような結果が出てきます。
$ cat /proc/<tomcat_java>/limits
Limit Soft Limit Hard Limit Units
Max open files 4096 4096 files
$ cat /proc/<root_apache>/limits
Limit Soft Limit Hard Limit Units
Max open files 8192 8192 files
$ cat /proc/<my_random_process>/limits
Limit Soft Limit Hard Limit Units
Max open files 1024 1048576 files
どうしたの?私が設定したfile-maxに興味を持つ唯一のプロセスは私自身のプロセスです。 (上記で使用した「ランダム」プロセスはbashシェルです。)ApacheとJavaのこれらの制限はどこから来ますか?上記の4096制限を超えていることは確かにわかりますが(これは私の問題かもしれません)、システムが設定した制限を使用する方法を知りません。
これにご協力いただきありがとうございます。
答え1
あなたの問題は次のとおりですsystemdを使用してサービス制限を設定するには?- Apache Tomcatサーバーの起動スクリプトで開かれたファイル制限の問題を解決する必要があります。例:Ubuntuシステムがsystemdを使用していると仮定すると、次のように起動スクリプトファイルを編集して、tomcat javaプロセスのオープンファイル制限を65000に増やすことができます。
/etc/systemd/system/tomcat.service:
[Unit]
Description=Tomcat Service
After=syslog.target network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
LimitNOFILE = 65000 <---------
....
[Install]
WantedBy=multi-user.target
デーモンを再ロードしてTomcatサーバーを再起動します。
systemctl daemon-reload
systemctl restart tomcat
確認してみてください。
pstree -pu |grep tomcat
|-java(23638,tomcat)-+-{java}(23645)
grep open /proc/23638/limits
Max open files 65000 65000 files