Il y a plusieurs mois, j'ai remarqué que mon éditeur de texte (emacs) et mon 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 s'exécutait lentement. J'ai trouvé que le coupable (de plus haut niveau) était un appel à socket.getfqdn()
.
L'exécution de la commande suivante dans le terminal sous OS X 10.10.2, démontre 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 lorsque 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 soit dû à l'attente de la requête DNS. Les résultats ci-dessus ont été obtenus en utilisant les serveurs DNS publics de Google. En revanche, si j'utilise les serveurs DNS de mon fournisseur d'accès, le délai 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 toujours un peu plus de 5 secondes)
Quelle est la cause de ce problème ? Mon nom d'hôte est-il invalide ou cause-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 confiugration DNS suivante est listé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 qui concernent le mDNS. Par exemple :
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
Cela semble important. Il est intéressant de noter que le délai d'attente indiqué ci-dessus est à peu près le même que les temps d'exécution ci-dessus.
Je dois préciser que je suis connecté à l'internet par WiFi et que le problème n'existe que lorsque j'essaie de résoudre le nom d'hôte de mon ordinateur.