호스트 이름 확인이 왜 그렇게 오래 걸립니까?


16

몇 달 전에 필자는 텍스트 편집기 (emacs)와 IDE (IntelliJ)가 시작하는 데 오랜 시간이 걸린다는 것을 알았습니다. 시간은 OS X가 사용하는 DNS 서버에 따라 달라졌습니다.

프로젝트의 테스트 스위트가 느리게 실행될 때 문제를 격리 할 수있었습니다. 나는 (높은 수준의) 범인이에 대한 전화라는 것을 알았습니다 socket.getfqdn().

OS X 10.10.2의 터미널에서 다음 명령을 실행하면 문제가 나타납니다.

$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()'  0.02s user 0.00s system 0% cpu 5.122 total

socket.getfqdn()가 호출되고 지연이 발생 했을 때 실행되는 코드를 추적 했습니다 getaddrinfo(3). 문제를 격리시키고 gai_strerror(3)다음 메시지를 제공 하는 작은 프로그램을 작성했습니다 .

$ time ./hostinfo
Hostname: MacBook-Pro.local
getaddrinfo: nodename nor servname provided, or not known
./hostinfo  0.00s user 0.00s system 0% cpu 5.101 total

지연이 DNS 쿼리 시간이 초과되기를 기다리는 것 같습니다. 위의 결과는 Google의 퍼블릭 DNS 서버를 사용한 것입니다. 그러나 ISP의 DNS 서버를 사용하면 시간이 30 초로 증가합니다.

$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()'  0.01s user 0.01s system 0% cpu 30.114 total

(흥미롭게도 C 프로그램은 hostinfo여전히 5 초 이상 걸립니다.)

이 문제의 원인은 무엇입니까? 호스트 이름이 유효하지 않거나 문제를 일으키는가?

$ hostname
MacBook-Pro.local

동일한 네트워크의 Macbook Air에서는이 문제가 발생하지 않습니다.

내가 볼 수있는 가장 큰 차이점은 문제가있는 시스템에 다음 DNS 구성이 나열되어 있다는 것입니다.

$ scutil --dns
DNS configuration

resolver #1
  search domain[0] : Home
  nameserver[0] : 8.8.8.8
  nameserver[1] : 8.8.4.4
  flags    : Request A records
  reach    : Reachable

DNS configuration (for scoped queries)

resolver #1
  search domain[0] : Home
  nameserver[0] : 8.8.8.8
  nameserver[1] : 8.8.4.4
  if_index : 4 (en0)
  flags    : Scoped, Request A records
  reach    : Reachable

Macbook Air에는 mDNS와 관련된 몇 가지 추가 항목이 포함되어 있습니다. 예를 들면 다음과 같습니다.

resolver #2
  domain   : local
  options  : mdns
  timeout  : 5
  flags    : Request A records
  order    : 300000

이것은 중요한 것 같습니다. 흥미롭게도 위에 나열된 시간 초과는 위의 런타임과 거의 같습니다.

WiFi를 사용하여 인터넷에 연결되어 있으며 컴퓨터의 호스트 이름을 확인하려고 할 때만 문제가 발생합니다.


n ° 67590 보드에 오신 것을 환영합니다. MBP가 인터넷 (이더넷, Wi-Fi, Bluetooth…)에 어떻게 연결되어 있는지 질문에 추가하십시오. 당신은 기본 ping my_ISP_DNS_server및 시도 했습니까 ping Google_DNS_server?
dan

답변:


13

HostNameusing scutil을 다음과 같은 값으로 명시 적으로 설정 하여이 문제를 해결할 수있었습니다 LocalHostName.

$ scutil --set HostName $(scutil --get LocalHostName)

지금:

$ sudo scutil --set HostName MacBook-Pro
$ time python -c 'import socket; print(socket.getfqdn())'
MacBook-Pro
python -c 'import socket; print(socket.getfqdn())'  0.01s user 0.00s system 86% cpu 0.016 total

나는 다음과 같은 이유로 혼란 스러웠다.

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

그러나:

$ scutil --get HostName
HostName: not set

다른 답변 에서 언급 했듯이이 문제를 해결해야 할 .local뿐만 아니라 설정해야 할 뿐만 아니라 포함해야합니다 (또는 .일반적으로).
Keith Smiley

4

나는 원래 같은 문제가 있었지만 결국 해결했다.

예전에는

$ scutil --get HostName
Michaels-Macbook-Pro
$ scutil --get LocalHostName
Michaels-Macbook-Pro
$ time python -c 'import socket; socket.getfqdn()'
... 30s ...

그런 다음 변경했습니다.

$ scutil --set HostName Michaels-Macbook-Pro.local
$ time python -c 'import socket; socket.getfqdn()'
... 5s ...

그런 다음에 추가했습니다. /etc/hosts

127.0.0.1       localhost Michaels-Macbook-Pro.local
::1             localhost Michaels-Macbook-Pro.local

빨리되었다.


2

같은 문제가 있었지만 귀하의 제안은 효과가 없었습니다.

결국이 작업을 수행하면이 작업을 수행하여 문제를 해결했습니다.

sudo scutil --set HostName uranus.local

내 컴퓨터 호스트는 'uranus'입니다. 나는 단지 '.local'을 추가해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.