文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

java.net.UnknownHostExceptionの罠

全然別のエラーだったりするのですよね〜


f:id:treeapps:20180426142529p:plain

tomcat上のアプリからhttp通信を行う際に、以下のような例外エラーが起きる事があります。

java.net.UnknownHostException: www.example.com
        at java.net.InetAddress.getAllByName0(InetAddress.java:1157)
        at java.net.InetAddress.getAllByName(InetAddress.java:1083)
        at java.net.InetAddress.getAllByName(InetAddress.java:1019)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.resolveHostname(DefaultClientConnectionOperator.java:242)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:130)
        at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
        at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
        at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:941)
・・・略・・・

一見するとUnknownHostということは相手側のサーバが悪いんだ!俺は悪くねえ!!と思ってしまいますね。

しかし、実は別のエラーによってUnknownHostExceptionが起きているケースがありました。

例えば以下の時に発生しました。

  • ディスク使用率が100%になったときにhttp接続しようとした時。(ソケットファイルが生成できない)
  • load averageが大変な数値になるほど負荷がかかった時。

ディスクが100%の時はcurlでapiを投げると接続できますが、tomcat上のアプリからは接続できませんでした。

高負荷の時も同様です。

どうもtomcat6系は、無効になったスレッドの再利用がうまく行われず、ゾンビスレッドを抱えやすいように思えます。

きちんとタイムアウトを設定しているにも関わらずです。

DB接続しようとしたスレッドが詰まってDB接続不能になった事もあります。

tomcat6系を使う場合、cronで1週間に1回は再起動した方がいいかもしれません。

tomcat7系を使っているプロジェクトではゾンビで埋まる事は経験してないので、6系の実装がよろしくないのかもしれませんね。