为什么我的主机名解析需要这么长时间?


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连接到Internet,并且该问题仅在尝试解析计算机的主机名时存在。


欢迎登机,编号67590。请在您的问题中添加您的MBP如何连接到Internet(以太网,Wi-Fi,蓝牙等)。您尝试过基本ping my_ISP_DNS_serverping Google_DNS_server吗?
2015年

Answers:


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(或者可能只是一个.普遍意义)。
基思·斯皮里

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”即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.