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.