¿Por qué tarda tanto la resolución de mi nombre de host?


16

Hace varios meses, noté que mi editor de texto (emacs) e IDE (IntelliJ) estaban tardando mucho en iniciarse. El tiempo parecía variar según los servidores DNS que OS X estaba usando.

Pude aislar el problema cuando el conjunto de pruebas de un proyecto se ejecutaba lentamente. Encontré al culpable (de nivel superior) a quien llamar socket.getfqdn().

Ejecutar el siguiente comando en la terminal en OS X 10.10.2, demuestra el 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

Rastreé el código que se ejecuta cuando socket.getfqdn()se llama y el retraso es causado por getaddrinfo(3). Escribí un pequeño programa que aísla el problema y gai_strerror(3)proporciona este mensaje:

$ 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 la demora está esperando que la consulta DNS expire. Los resultados anteriores estaban utilizando los servidores DNS públicos de Google. Sin embargo, si uso los servidores DNS de mi ISP, el tiempo aumenta a 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, el programa C hostinfotodavía toma poco más de 5 segundos)

¿Qué está causando este problema? ¿Mi nombre de host no es válido o está causando problemas?

$ hostname
MacBook-Pro.local

Este problema no ocurre en un Macbook Air en la misma red.

La principal diferencia que puedo ver es que en la máquina problemática, se enumera la siguiente configuración de 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

En el Macbook Air, se incluyen varias entradas adicionales relacionadas con mDNS. Por ejemplo:

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

Esto parece ser significativo. Curiosamente, el tiempo de espera mencionado anteriormente es casi el mismo que los tiempos de ejecución anteriores.

Debo señalar que estoy conectado a Internet mediante WiFi y que el problema solo existe cuando intento resolver el nombre de host de mi computadora.


Bienvenido a bordo n ° 67590. Agregue en su pregunta cómo se conecta su MBP a Internet (Ethernet, Wi-Fi, Bluetooth ...). ¿Probaste un básico ping my_ISP_DNS_servery ping Google_DNS_server?
dan

Respuestas:


13

Pude solucionar este problema estableciendo explícitamente el HostNameuso scutilcon el mismo valor que LocalHostName:

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

Ahora:

$ 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

Estaba confundido antes por lo siguiente:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Pero:

$ scutil --get HostName
HostName: not set

Como se indicó en la otra respuesta , parece que esto no solo se debe configurar, sino que también debe contener .local(o tal vez solo un .en general).
Keith Smiley

4

Originalmente tuve el mismo problema, pero finalmente lo resolví.

Solía ​​tener:

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

Entonces cambié:

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

Luego agregué a: /etc/hosts

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

Se hizo rápido.


2

Tuve el mismo problema, pero sus sugerencias no funcionaron para mí.

Finalmente, lo arreglé haciendo esto una vez que hice esto:

sudo scutil --set HostName uranus.local

El host de mi máquina es 'Urano'. Solo tuve que agregar '.local'.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.