스위치 (DNS 포함) 이슈로 발생할 수 있다. 특히 시스템이 문제 없다면, JVM 자체 문제일 수 있다.


The NoRouteToHostException will be thrown while attempting to connect to a remote host but the host cannot be reached for instance because of a badly configured router or a blocking firewall.

Most applications should not catch this exception; it is more robust to catch the superclass SocketException. 



아래 내용은 인프라 이슈가 아닌 JVM자체 이슈에 대해서 다룬 것이다. 


 

* 원인


JVM를 restart하면된다. DNS를 추가. 혹은 ip변경시에 java는 항상 그것을 캐쉬하고 있는 상태이기 때문에 해당 서버를 DNS정보로부터 받지 못한다.

 

 

* 증상

 


 

Server is not available * Additional Info *
qString :
http://isag.google.com:8080/common/monitor/ok.html
vhost :

 

 2007-08-29 19:18:20 [ERROR](HttpClientWrapper.java:293) No route to host : HttpClientWrapper[ encoding = MS949 establishTimeout = 12000 followRedirects = true noCache = true params = [] prepareURL = null soTimeout = 5000 statusCode = -1 SYSTEM_ENCODING = ISO8859-1 url = http://isag.google.com.com:8080/common/monitor/ok.html vhost = bodyString = null]

java.net.NoRouteToHostException: No route to host

 

모니터 java단에서 No route to host라 계속 뜬다.

 

* 해결

JVM 웹서버 재시작 또는 매번 DNS서버에서 정보를 읽어 올 수 있도록 옵션 추가해서 재시작한다. 

 -Dsun.net.inetaddr.ttl=50


 

* 이유

파일은 캐쉬되는 경향이 있다. 실제 native단에서는 한번 try한 것은 일부러 캐쉬하여 다음번 요청에 대해서 그 결과를 알려주는 경우가 있다.

네트웍도 마찬가지로 그렇게 되어 있다.

 


------


java8 소스를 보니까. NoRouteToHostException이 발생하려면 2가지 이유 중의 하나이다. 


1. EADDRNOTAVAIL

NoRouteToHostException은 소켓 연결시 EADDRNOTAVAIL이 발생하면 Exception을 던지도록 되어 있다. EADDRNOTAVAIL의 의미가 Address not available 라는 의미더라구요. DNS 이슈 문제가 아니면, 순간적으로 app server에서 특정 서버 소켓 연결을 위해 클라이언트 포트를 많이 생성(임시포트(ip_local_port_range값에서 max-min의 값)까지 생성)하면서 나는 이슈로 볼 수 있을 것 같다.  

$  cat /proc/sys/net/ipv4/ip_local_port_range

32768 65000

$  cat /proc/sys/net/ipv4/tcp_tw_reuse

0


2. EHOSTUNREACH


routing table 쪽으로 이슈가 발생해서 reach할 수 없으면 해당 에러가 발생한다. 





Posted by 김용환 '김용환'

댓글을 달아 주세요