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 hostinfo
impiega 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.
ping my_ISP_DNS_server
&ping Google_DNS_server
?