Hace varios meses me di cuenta de que mi editor de texto (emacs) y el IDE (IntelliJ) estaban tomando mucho tiempo para arrancar. El tiempo parecía variar en función de los servidores DNS OS X estaba usando.
Yo era capaz de aislar el problema cuando un proyecto conjunto de pruebas se ejecuta lentamente. He encontrado el (nivel superior) culpable a ser una llamada a socket.getfqdn()
.
Ejecutando el siguiente comando en la terminal en OS X 10.10.2, muestra 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
He seguido 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 el retraso está a la espera de la consulta DNS a tiempo. Los resultados anteriores fueron el uso de Google en servidores DNS públicos. Si yo uso mis servidores DNS del ISP, sin embargo, 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 de C hostinfo
todavía tiene justo encima de 5 segundos)
Qué está causando este problema? Es mi nombre de host no válido o causando problemas?
$ hostname
MacBook-Pro.local
Este problema no ocurre en un Macbook Air en la misma red.
La principal diferencia que veo es que en la problemática de la máquina, los siguientes DNS confiugration se enumeran:
$ 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, varios extras incluye entradas que se refieren a mDNS. Por ejemplo:
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
Este parece ser importante. Curiosamente, el tiempo de espera de arriba es acerca de la misma como los tiempos de ejecución anterior.
Debo señalar que estoy conectado a internet mediante WiFi y el problema sólo existe cuando tratando de resolver mi nombre de host del equipo.