Por que minha resolução de nome de host está demorando tanto?


16

Há alguns meses, notei que meu editor de texto (emacs) e IDE (IntelliJ) estavam demorando muito tempo para iniciar. O tempo parecia variar com base nos servidores DNS que o OS X estava usando.

Consegui isolar o problema quando o conjunto de testes de um projeto estava sendo executado lentamente. Eu achei o culpado (de nível superior) um chamado socket.getfqdn().

A execução do seguinte comando no terminal no OS X 10.10.2 demonstra o problema:

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

Rastreei o código que é executado quando socket.getfqdn()é chamado e o atraso é causado por getaddrinfo(3). Eu escrevi um pequeno programa que isola o problema e gai_strerror(3)fornece esta mensagem:

$ 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

Parece que o atraso está aguardando o tempo limite da consulta DNS. Os resultados acima estavam usando servidores DNS públicos do Google. Se eu usar os servidores DNS do meu ISP, no entanto, o tempo aumentará para 30 segundos:

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

(curiosamente, o programa C hostinfoainda leva pouco mais de 5 segundos)

O que está causando esse problema? Meu nome de host é inválido ou está causando problemas?

$ hostname
MacBook-Pro.local

Esse problema não ocorre em um Macbook Air na mesma rede.

A principal diferença que vejo é que, na máquina problemática, a seguinte configuração de DNS está listada:

$ 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

No Macbook Air, estão incluídas várias entradas extras relacionadas ao mDNS. Por exemplo:

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

Isso parece ser significativo. Curiosamente, o tempo limite listado acima é aproximadamente o mesmo que os tempos de execução acima.

Devo observar que estou conectado à Internet usando Wi-Fi e o problema só existe ao tentar resolver o nome do host do meu computador.


Boas-vindas a bordo n ° 67590. Por favor, adicione à sua pergunta como o seu MBP está conectado à Internet (Ethernet, Wi-Fi, Bluetooth ...). Você tentou um ping my_ISP_DNS_server& básico ping Google_DNS_server?
dan

Respostas:


13

Consegui corrigir esse problema definindo explicitamente o HostNameuso scutilcomo o mesmo valor que LocalHostName:

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

Agora:

$ 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

Eu estava confuso antes por causa do seguinte:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Mas:

$ scutil --get HostName
HostName: not set

Como afirmado na outra resposta , parece que isso não só deve ser definido, mas também deve conter .local(ou talvez apenas um .em geral).
Keith Smiley

4

Originalmente, tive o mesmo problema, mas finalmente o resolvi.

Eu costumava ter:

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

Então eu mudei:

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

Então eu adicionei em: /etc/hosts

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

Tornou-se rápido.


2

Teve o mesmo problema, mas suas sugestões não funcionaram para mim.

Eventualmente, eu o corrigi fazendo isso uma vez que fiz isso:

sudo scutil --set HostName uranus.local

O host da minha máquina é 'urano'. Eu só tinha que adicionar '.local' a ele.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.