読者です 読者をやめる 読者になる 読者になる

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

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

java.net.UnknownHostExceptionの罠

java tomcat

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%の時はcurlapiを投げると接続できますが、tomcat上のアプリからは接続できませんでした。
高負荷の時も同様です。

どうもtomcat6系は、無効になったスレッドの再利用がうまく行われず、
ゾンビスレッドを抱えやすいように思えます。
きちんとタイムアウトを設定しているにも関わらずです。
DB接続しようとしたスレッドが詰まってDB接続不能になった事もあります。
tomcat6系を使う場合、cronで1週間に1回は再起動した方がいいかもしれません。
tomcat7系を使っているプロジェクトではゾンビで埋まる事は経験してないので、
6系の実装がよろしくないのかもしれませんね。

Jakarta Tomcatエキスパートガイド―Webアプリケーションのための環境構築

Jakarta Tomcatエキスパートガイド―Webアプリケーションのための環境構築

  • 作者: アミツト・バコレ,中川和夫,Ja-Jakarta
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2003/08
  • メディア: 単行本
  • 購入: 2人 クリック: 23回
  • この商品を含むブログ (14件) を見る