Pourquoi la résolution de mon nom d'hôte prend-elle autant de temps?

16

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 hostinfoprend 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.

user67590
la source
Bienvenue à bord n ​​° 67590. Veuillez ajouter dans votre question comment votre MBP est connecté à Internet (Ethernet, Wi-Fi, Bluetooth…). Avez-vous essayé un ping my_ISP_DNS_server& basique ping Google_DNS_server?
dan

Réponses:

13

J'ai pu résoudre ce problème en définissant explicitement l' HostNameutilisation scutilde la même valeur que LocalHostName:

$ scutil --set HostName $(scutil --get LocalHostName)

Maintenant:

$ sudo scutil --set HostName MacBook-Pro
$ time python -c 'import socket; print(socket.getfqdn())'
MacBook-Pro
python -c 'import socket; print(socket.getfqdn())'  0.01s user 0.00s system 86% cpu 0.016 total

J'étais confus avant pour les raisons suivantes:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Mais:

$ scutil --get HostName
HostName: not set
user67590
la source
Comme indiqué dans l' autre réponse, il semble que cela doive non seulement être réglé mais aussi contenir .local(ou peut-être juste un .en général).
Keith Smiley
4

J'avais à l'origine le même problème, mais je l'ai finalement résolu.

J'avais:

$ scutil --get HostName
Michaels-Macbook-Pro
$ scutil --get LocalHostName
Michaels-Macbook-Pro
$ time python -c 'import socket; socket.getfqdn()'
... 30s ...

Puis j'ai changé:

$ scutil --set HostName Michaels-Macbook-Pro.local
$ time python -c 'import socket; socket.getfqdn()'
... 5s ...

J'ai ensuite ajouté: /etc/hosts

127.0.0.1       localhost Michaels-Macbook-Pro.local
::1             localhost Michaels-Macbook-Pro.local

C'est devenu rapide.

Michael Kim
la source
2

J'ai eu le même problème, mais vos suggestions n'ont pas fonctionné pour moi.

Finalement, je l'ai corrigé en faisant ceci une fois que j'ai fait ceci:

sudo scutil --set HostName uranus.local

L'hôte de ma machine est 'uranus'. Je n'ai eu qu'à y ajouter «.local».

bstst
la source