Il y a plusieurs mois, j'ai remarqué que mon éditeur de texte (emacs) et IDE (IntelliJ) mettaient beaucoup de temps à démarrer. Le temps semblait varier en fonction des serveurs DNS qu'OS X utilisait.
J'ai pu isoler le problème lorsque la suite de tests d'un projet fonctionnait lentement. J'ai trouvé que le coupable (de niveau supérieur) était un appel à socket.getfqdn()
.
L'exécution de la commande suivante dans le terminal sur OS X 10.10.2 illustre le problème:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.02s user 0.00s system 0% cpu 5.122 total
J'ai tracé le code qui s'exécute quand socket.getfqdn()
est appelé et le retard est causé par getaddrinfo(3)
. J'ai écrit un petit programme qui isole le problème et gai_strerror(3)
fournit ce message:
$ 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
Il semble que le délai attend que la requête DNS expire. Les résultats ci-dessus utilisaient les serveurs DNS publics de Google. Cependant, si j'utilise les serveurs DNS de mon FAI, le temps passe à 30 secondes:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.01s user 0.01s system 0% cpu 30.114 total
(curieusement, le programme C hostinfo
prend encore un peu plus de 5 secondes)
Quelle est la cause de ce problème? Mon nom d'hôte est-il invalide ou pose-t-il des problèmes?
$ hostname
MacBook-Pro.local
Ce problème ne se produit pas sur un Macbook Air sur le même réseau.
La principale différence que je peux voir est que sur la machine problématique, la configuration DNS suivante est répertoriée:
$ 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
Sur le Macbook Air, plusieurs entrées supplémentaires sont incluses concernant le mDNS. Par exemple:
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
Cela semble important. Fait intéressant, le délai indiqué ci-dessus est à peu près le même que les temps d'exécution ci-dessus.
Je dois noter que je suis connecté à Internet en utilisant le WiFi et que le problème n'existe que lorsque j'essaie de résoudre le nom d'hôte de mon ordinateur.
ping my_ISP_DNS_server
& basiqueping Google_DNS_server
?