java.net.ConnectException: 接続拒否エラー

接続拒否に関連するエラーがログに記録されます。

症状

エラーのほかに、以下のような動作も断続的に確認されます。
  1. CPU 使用量が 100% を上回るまで急上昇します。
  2. インストールを所有するアプリケーション・ユーザーがサーバーにログインできません。 他のユーザーは問題なく作業できます。
  3. ダウンストリーム・システムがアプリケーションと対話できません。
製品は、アプリケーションを再始動すると正常に機能します。 なぜこのようになるのでしょうか、またどのように回避できますか?

原因

ユーザーの作成時に、ユーザーに割り当てることができるリソース使用量の制限を、そこから作成するプロセスと共に指定します。こうすることで、障害発生時にユーザーがサーバー全体を異常終了させる可能性を回避します。 ただし、この制限が低すぎた場合にも、ユーザーの問題、およびユーザーの所有するプロセスの問題の発生につながります。
java.net.ConnectException 例外を受け取る一般的な理由の 1 つに、ユーザーがアプリケーションの要求するプロセスを作成できないため、バックエンド・サーバーに接続できないことが挙げられます。この制限を制御する構成は「ulimit -u」設定であり、ユーザーが使用可能なプロセスの最大数を指定します。 ユーザーがすべての使用可能なプロセスを使い尽くすと、新しい接続を作成できなくなり、結果として上記の問題や、以下のような例外が発生します。

Exception:Connection refused to host: 10.15.66.164; nested exception is:
java.net.ConnectException: Connection refused
java.rmi.ConnectException: Connection refused to host: 10.15.66.164; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:210)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:196)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:122)
at com.ibm.ccd.scheduler.common.Scheduler_Stub.getRunningInfo(Scheduler_Stub.java:236)
at com.ibm.ccd.scheduler.common.JobStatus._updateStatus(JobStatus.java:71)
at com.ibm.ccd.scheduler.common.JobStatus.getCached(JobStatus.java:147)
at com.ibm.ccd.scheduler.common.JobStatus.getRunningByJobId(JobStatus.java:158)
at com.ibm.ccd.scheduler.threads.MasterThread.checkJobNotCurrentlyRunningOnAnyJVM(MasterThread.java:266)
at com.ibm.ccd.scheduler.threads.MasterThread.fuzaoRun(MasterThread.java:418)
at com.ibm.ccd.common.util.FuzaoRunnableAdapter.run(FuzaoRunnableAdapter.java:54)
at com.ibm.ccd.common.util.FuzaoThread.run(FuzaoThread.java:123)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:243)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:230)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
at java.net.Socket.connect(Socket.java:539)
at java.net.Socket.connect(Socket.java:488)
at java.net.Socket.<init>(Socket.java:385)
at java.net.Socket.<init>(Socket.java:199)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:34)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:140)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:607)
... さらに 11 の例外

問題の解決

コマンド「ulimit -u」を使用して、サーバーで許可されるプロセスの最大数を確認します。
これが 1024 のような小さい値に設定されている場合は、以下のようにして 131072 まで増やすか、無制限に設定してください。

ulimit -u 131072
ulimit -u unlimited

この値を増やすことで、アプリケーション・ユーザーは正常に作業できるはずです。


最終更新: 12 Mar 2019