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

14

Diversi mesi fa ho notato che il mio editor di testo (emacs) e IDE (IntelliJ) impiegavano molto tempo per avviarsi. L'ora sembrava variare in base ai server DNS che OS X stava usando.

Sono stato in grado di isolare il problema quando la suite di test di un progetto stava funzionando lentamente. Ho trovato il colpevole (livello superiore) come chiamata a socket.getfqdn() .

L'esecuzione del seguente comando 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 viene chiamato socket.getfqdn() 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 passa 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 hostinfo richiede ancora poco più di 5 secondi)

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

$ 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

Sul MacBook Air sono incluse diverse voci aggiuntive relative a mDNS. Ad esempio:

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

Questo sembra essere significativo. È interessante notare che il timeout elencato sopra è all'incirca lo stesso dei runtime sopra.

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

    
posta user67590 04.03.2015 - 14:06
fonte

3 risposte

10

Sono riuscito a risolvere questo problema impostando in modo esplicito HostName utilizzando scutil per avere lo stesso valore di LocalHostName :

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

Ora:

$ 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 di quanto segue:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Ma:

$ scutil --get HostName
HostName: not set
    
risposta data 07.03.2015 - 21:32
fonte
3

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

Poi ho aggiunto: /etc/hosts

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

È diventato veloce.

    
risposta data 25.11.2017 - 01:42
fonte
2

Ho avuto lo stesso problema, ma i tuoi suggerimenti non hanno funzionato per me.

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

sudo scutil --set HostName uranus.local

L'host della mia macchina è "uranus". Ho solo dovuto aggiungere ".local" ad esso.

    
risposta data 11.01.2016 - 15:31
fonte

Leggi altre domande sui tag