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

14

Hace varios meses noté que mi editor de texto (emacs) e IDE (IntelliJ) tardaban mucho tiempo en iniciarse. El tiempo pareció variar según los servidores DNS que utilizaba OS X.

Pude aislar el problema cuando el conjunto de pruebas de un proyecto se ejecutaba lentamente. Encontré que el culpable (nivel superior) era una llamada a socket.getfqdn() .

Ejecutar el siguiente comando en el 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 se llama a socket.getfqdn() 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 el retraso está a la espera de que se agote el tiempo de espera de la consulta de DNS. 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 hostinfo todaví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 una Macbook Air en la misma red.

La principal diferencia que puedo ver es que en la máquina problemática, aparece 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 aproximadamente el mismo que el tiempo de ejecución anterior.

Debo tener en cuenta que estoy conectado a Internet mediante WiFi y que el problema solo existe al intentar resolver el nombre de host de mi computadora.

    
pregunta user67590 04.03.2015 - 14:06

3 respuestas

10

Pude solucionar este problema configurando explícitamente que HostName usando scutil para que tenga 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

Antes estaba confundido debido a lo siguiente:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Pero:

$ scutil --get HostName
HostName: not set
    
respondido por el user67590 07.03.2015 - 21:32
3

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 ...

Luego 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.

    
respondido por el Michael Kim 25.11.2017 - 01:42
2

Tuve el mismo problema, pero tus 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 'uranus'. Solo tuve que agregarle '.local'.

    
respondido por el bstst 11.01.2016 - 15:31

Lea otras preguntas en las etiquetas