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 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 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.
ping my_ISP_DNS_server
yping Google_DNS_server
?