woonizzooni

InetUtils : Cannot determine local hostname 본문

Spring

InetUtils : Cannot determine local hostname

woonizzooni 2019. 6. 23. 23:32

TL; DR

 

1. loopback IP와 공인망으로 나가는 인터페이스 IP를 제외한
   나머지 IP를 갖는 활성화된 모든 네트워크 인터페이스의 IP를 hosts파일에 기록하라.

ex)
127.0.0.1       localhost local Local
::1             localhost
192.168.10.3    MYDESKTOP
192.168.56.1    MYDESKTOP-VIRTUALBOX-SWITCH-GW
192.168.99.1    MYDESKTOP-VIRTUALBOX-NAT-GW

2. properties or yml에 spring.cloud.inetutils.ignoredInterfaces에 

   '1'에 해당하는 인터페이스 장치 이름에 matches될 수 있는 regex를 등록하라.

ex) Windows10 예.

spring:
  cloud:
    inetutils:
      ignoredInterfaces:
        - VirtualBox.*
        - Hyper-V.*
        - Npcap.*
        - VMware.*

 


Windows10 기준으로 설명. (Mac/Linux의 동작도 동일하다고 보면 됨)

 

아래와 같은 네트워크 연결 구조를 예를 들어 설명.

아래와 같은 hosts파일에는 보통 아무것도 등록되어 있지 않거나

127.0.0.1 localhost 와 같은 loopback ip가 localhost 이름으로 등록되어 있음. (없으면 주석해제 or 추가)

  [Windows]
      c:\windows\system32\drivers\etc\hosts
  [MacOS or Linux .. ]
      /etc/hosts

(기타 참고)

   Windows의 경우 loopback ip의 패킷 캡쳐가 기본적으로는 불가능한데,

   이를 Npcap Loopback Adapter를 통해 가능하게 됨 (** 최근 Wireshark 설치시 동반 설치되는 pcap 라이브러리/드라이버에 의해 생성됨)

 

 

 

문제의 로그는 org.springframework.cloud.commons.util.InetUtils.java

[1] findFirstNonLoopbackHostInfo()
ㄴ[2] findFirstNonLoopbackAddress()

   ㄴ[3] convertAddress() : 이 함수 동작 과정에서 hostname을 찾지 못해 발생

o.s.cloud.commons.util.InetUtils : Cannot determine local hostname

상세)

HostInfoEnvironmentPostProcessor

  .postProcessEnvironment()

    .getFirstNonLoopbackHostInfo()

    InetUtils

        .findFirstNonLoopbackHostInfo()

            .findFirstNonLoopbackAddress()

            .convertAddress()

 

 

 

이에 해당하는 내용을 찾기 위해 [2]과정을 살펴보면

   - 인터페이스가 활성화되어 있고,

   - ignoreInterface() 목록에 해당하지 않는 인터페이스 이름이면서

   - loopback 주소가 아닌

'첫' 인터페이스의 IP에 대해 hostname을 찾는데 이 과정에 없을 경우 발생.

 

 

맥북의 경우 이 과정이 순식간에 (1초내) 지나가서 체감 자체가 느리다고 상상자체를 못했는데,

데탑(윈10)의 경우 1~2초가 걸리는것이 아닌가?

[2]과정이 꽤나(!) 오래 걸리는데 이유는 인터페이스 개수 자체가 너무 많고 (아래 표)

아래 함수에서 '초'단위의 시간이 소요되기 때문이라고 판단. (getHostName())

 

 

1. hosts파일 에 네트워크 인터페이스 장치의 IP의 hostname등록.

우선 'Cannot determine local hostname' 이 메시지 자체를 제거하고 싶다면, 활성화된 인터페이스의 IP를 hosts파일에 등록하자. 

ex)

ex)
127.0.0.1       localhost local Local
::1             localhost
192.168.10.3    MYDESKTOP
192.168.56.1    MYDESKTOP-VIRTUALBOX-SWITCH-GW
192.168.99.1    MYDESKTOP-VIRTUALBOX-NAT-GW

이는 spring cloud framework뿐만 아니라 다른 앱 사용 과정에서도 유사하게 발생할 수 있으니 등록해도 해가 되지는 않을 것 같다.

 

 

2. ignoredInterface에 프로그램과 상관없는 인터페이스 장치 이름 정규표현식 등록

그리고, 이 자체를 spring boot 동작과 무관한 인터페이스의 경우 다음과 같이 ignoredInterface로 등록하자.

bootstrap.xml이 더 적당(?)할 것 같다. (이름의 경우 OS마다 다를 것으로 예상)

ex) Windows10 예.

spring:
  cloud:
    inetutils:
      ignoredInterfaces:
        - VirtualBox.*
        - Hyper-V.*
        - Npcap.*
        - VMware.*

 

IntelliJ IDEA에서 구동 중인 spring boot앱의 응답 속도 측정 결과의 전/후 결과는 다음과 같았다.

평균 2초 걸리던 응답 소요시간이 1초로 절반으로 감소되었다.

 

(측정 스크립트)

#!/bin/bash
start_time=$( date +%s.%N )

curl -X GET "http://localhost:10010/...";

elapsed_time=$( date +%s.%N --date="$start_time seconds ago" )
echo elapsed_time: $elapsed_time

 

우선 보기 싫은 로그가 사라졌고, 응답도 빨라졌으니 이 상태를 유지하자.

마지막으로, InetUtils에 isPreferredAddress(address)로도 ignoring이 가능한데, 난 어차피 인터페이스명을 먼저 찾기도 하고 IP의 경우 관리가 더 귀찮아서 안함.

 

'Spring' 카테고리의 다른 글

Spring Cloud Bus 동작 확인  (0) 2019.07.06
Spring Cloud Config 동작 확인  (0) 2019.07.06
Spring Cloud Config "fetching config from server at:"  (0) 2019.07.05
Comments