몇 달 전에 필자는 텍스트 편집기 (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를 사용하여 인터넷에 연결되어 있으며 컴퓨터의 호스트 이름을 확인하려고 할 때만 문제가 발생합니다.
ping my_ISP_DNS_server
및 시도 했습니까ping Google_DNS_server
?