ソケット上で開いているファイルが多すぎます

ソケット上で開いているファイルが多すぎます

大きな問題があります。それは、残念ながらシャットダウンして再起動できない (方法がわからないし、間違いを犯したくない) 会社の実稼働アプリケーションが、FTP サーバーから読み取るためにソケットを開こうとすると、開いているファイルが多すぎるために多くの例外を吐き出してしまうことです。

2013-01-02 16:19:03,222 ERROR [main] software.background.Program(Program.java:doExecute{225}) - Exception during ftp transfer
someclasses.ftp.FtpException: Could not create connection to xxxx
    at someclasses.communication.ftp.FtpImpl.connect(FtpImpl.java:114)
    at Program.doExecute(Program.java:176)
    at Program.main(Program.java:287)
Caused by: java.net.SocketException: Too many open files
    at java.net.Socket.createImpl(Socket.java:397)
    at java.net.Socket.<init>(Socket.java:371)
    at java.net.Socket.<init>(Socket.java:189)
    at someclasses.Ftp.connect(Ftp.java:386)

アプリケーションごとに開いているファイルやソケットなどの制限に達したことは理解しています。当面、アプリケーションを閉じずにこの最大数を増やす方法はありますか? コマンドを実行しましたが、ulimitと表示されますunlimited。 コマンドで開いている接続の数を確認しようとしましたlsof -p PIDが、「コマンドが見つかりません」と表示されます。

lsof が持つ同様の効果 (Red Hat マシンだと思います) を見つけるのを手伝っていただける方、またこの一時的な問題を解決する方法についてアドバイスいただける方、いらっしゃいましたら大変嬉しく思います。最も快適な解決策は、アプリケーションが開くことができるファイル/ソケットを増やすことです。これは単なる単純な Java アプリケーションです。

前もって感謝します!

編集 もう 1 つの解決策は、このプログラムが最初からすべてのフラグを使用してどのように実行されたかを調べることができるコマンドがあれば、それが可能になるということです。そうすれば、正常に再起動できるかもしれません。これはレガシー アプリです。

答え1

結局、アプリケーションを再起動することで解決しました。ulimit -n を 2048 に変更し、構成を再ロードしました。ただし、すべてのプロセスが古い構成を継承したため、アプリケーションを再起動する必要がありました。

関連情報