java.io.IOException: Unable to establish loopback connection が発生して困った話

2018年7月19日Java, 開発

おはようございます。

稼働中のサービスが急に繋がらなくなってしまい調べてみたところ
「java.io.IOException: Unable to establish loopback connection」が発生していたのでちょっと調べてみました。

スポンサーリンク

サービス接続不可

Tomcatのエラーログを調査したところ、
java.net.SocketException: No buffer space available (maximum connections reached?)
も発生していた。

エフェメラルポートが枯渇したことにより
新しい接続が開始できずにサービス停止状態となっていた可能性があるとのこと。

ポート枯渇

じゃあ、何故ポートが枯渇したのか。

Nginxの設定

keep_alive の設定値が影響している可能性があります。
デフォルトは75(秒)です。
参考:
k3286’s opinion 様サイト

使用可能ポートの上限

Windows Server2008では使用ポートが49152番から65535番までとなっていて、
全て使い切ると外部サーバへの接続等ができなくなるようです。
(普通は使い切ることはなさそうですが)

TIME_WAITステータス継続時間

デフォルトで240秒となっていますが、推奨は60秒とのことです。
何故推奨値をデフォルトとしないのか。マイクロソフトよ。

参考

下記ページにて解説されています。
Java EE運用ガイド
Windows:OSが使用可能な通信ポート数の制限により、通信が困難になる問題

対応

OSの設定変更

ポート数の上限は、おそらく問題ないのかと思うのでステータス継続時間を変更する。

レジストリキー

  • ポート数上限(MaxUserPort)
    デフォルトは「5000」、最大で「65534」まで設定可能。
  • TIME_WAITEステータス継続時間(TcpTimedWaitDelay)
    デフォルトは240(秒)、推奨は60秒とのこと。

※1 設定変更後は再起動が必要
※2 レジストリを編集するので自己責任で。

サーバの定期再起動

日次、または週次で夜間にサーバの再起動が出来れば、
同様の障害発生率を下げられるかと思います。

365日無停止のサービスってのは難しいですよねー。

まとめ

こういった問題は知識や経験がないとなかなか防ぐことができないですよね。
まだまだ足りないなーって痛感させられました。

ではでは。

スポンサーリンク


関連するコンテンツ