Perché la risoluzione del mio nome host sta impiegando così tanto tempo?


16

Diversi mesi fa ho notato che il mio editor di testo (emacs) e IDE (IntelliJ) stavano impiegando molto tempo per avviarsi. Il tempo sembrava variare in base ai server DNS utilizzati da OS X.

Sono stato in grado di isolare il problema quando la suite di test di un progetto funzionava lentamente. Ho scoperto che il colpevole (di livello superiore) era una chiamata a socket.getfqdn().

L'esecuzione del comando seguente nel terminale su OS X 10.10.2, dimostra il 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

Ho rintracciato il codice che viene eseguito quando socket.getfqdn()viene chiamato e il ritardo è causato da getaddrinfo(3). Ho scritto un piccolo programma che isola il problema e gai_strerror(3)fornisce questo messaggio:

$ 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

Sembra che il ritardo sia in attesa del timeout della query DNS. I risultati sopra riportati utilizzavano i server DNS pubblici di Google. Se utilizzo i server DNS del mio ISP, tuttavia, il tempo aumenta a 30 secondi:

$ 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 il programma C hostinfoimpiega ancora poco più di 5 secondi)

Cosa sta causando questo problema? Il mio nome host non è valido o causa problemi?

$ hostname
MacBook-Pro.local

Questo problema non si verifica su un Macbook Air sulla stessa rete.

La differenza principale che posso vedere è che sulla macchina problematica è elencata la seguente confiugrazione 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

Su Macbook Air, sono incluse diverse voci aggiuntive relative a mDNS. Per esempio:

resolver #2
  domain   : local
  options  : mdns
  timeout  : 5
  flags    : Request A records
  order    : 300000

Questo sembra essere significativo. È interessante notare che il timeout sopra elencato è quasi lo stesso dei runtime precedenti.

Dovrei notare che sono connesso a Internet tramite WiFi e il problema esiste solo quando provo a risolvere il nome host del mio computer.


Benvenuto a bordo n ° 67590. Aggiungi la tua domanda su come il tuo MBP è connesso a Internet (Ethernet, Wi-Fi, Bluetooth ...). Hai provato un semplice ping my_ISP_DNS_server& ping Google_DNS_server?
dan

Risposte:


13

Sono stato in grado di risolvere questo problema impostando esplicitamente l' HostNameutilizzo scutildello stesso valore di LocalHostName:

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

Adesso:

$ 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

Ero confuso prima a causa di quanto segue:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Ma:

$ scutil --get HostName
HostName: not set

Come indicato nell'altra risposta , sembra che questo non solo debba essere impostato ma deve contenere .localanche (o forse solo un .in generale).
Keith Smiley,

4

Inizialmente avevo lo stesso problema, ma alla fine l'ho risolto.

Avevo:

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

Poi ho cambiato:

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

Quindi ho aggiunto in: /etc/hosts

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

È diventato veloce.


2

Aveva lo stesso problema, ma i tuoi suggerimenti non funzionavano per me.

Alla fine, l'ho risolto facendo questo una volta che ho fatto questo:

sudo scutil --set HostName uranus.local

Il mio host di macchina è "uranus". Ho dovuto solo aggiungere '.local'.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.