일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Kubernetes
- kubectl
- golang
- Shell script
- Pod
- wireshark
- Python
- docker
- Windows10
- VSCode
- Sysinternals
- ebpf
- HLS
- deployment
- namespace
- aws
- nginx-media-server
- aws cli
- 행정구역분류
- RTMP
- Android
- spring cloud config
- configmap
- macos
- Java
- dart
- service
- android studio
- ffmpeg
- Flutter
- Today
- Total
woonizzooni
InetUtils : Cannot determine local hostname 본문
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 |