23 votes

Pourquoi la résolution de mon nom d'hôte est-elle si longue ?

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.

23voto

user67590 Points 481

J'ai pu résoudre ce problème en paramétrant explicitement l'option HostName en utilisant scutil pour être 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 auparavant à cause de ce qui suit :

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Mais :

$ scutil --get HostName
HostName: not set

9voto

Michael Kim Points 190

J'avais initialement le même problème, mais j'ai fini par le résoudre.

J'avais l'habitude :

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

Puis j'ai ajouté dans : /etc/hosts

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

C'est devenu rapide.

2voto

Imrul Points 1486

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

Finalement, je l'ai réparé en faisant ça, une fois que j'ai fait ça :

sudo scutil --set HostName uranus.local

L'hôte de ma machine est 'uranus'. Il m'a suffi d'y ajouter '.local'.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X