几个月前,我注意到我的文本编辑器(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连接到Internet,并且该问题仅在尝试解析计算机的主机名时存在。
ping my_ISP_DNS_server
&ping Google_DNS_server
吗?