Há alguns meses, notei que meu editor de texto (emacs) e IDE (IntelliJ) estavam demorando muito tempo para iniciar. O tempo parecia variar com base nos servidores DNS que o OS X estava usando.
Consegui isolar o problema quando o conjunto de testes de um projeto estava sendo executado lentamente. Eu achei o culpado (de nível superior) um chamado socket.getfqdn()
.
A execução do seguinte comando no terminal no OS X 10.10.2 demonstra o 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
Rastreei o código que é executado quando socket.getfqdn()
é chamado e o atraso é causado por getaddrinfo(3)
. Eu escrevi um pequeno programa que isola o problema e gai_strerror(3)
fornece esta mensagem:
$ 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
Parece que o atraso está aguardando o tempo limite da consulta DNS. Os resultados acima estavam usando servidores DNS públicos do Google. Se eu usar os servidores DNS do meu ISP, no entanto, o tempo aumentará para 30 segundos:
$ 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, o programa C hostinfo
ainda leva pouco mais de 5 segundos)
O que está causando esse problema? Meu nome de host é inválido ou está causando problemas?
$ hostname
MacBook-Pro.local
Esse problema não ocorre em um Macbook Air na mesma rede.
A principal diferença que vejo é que, na máquina problemática, a seguinte configuração de DNS está listada:
$ 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
No Macbook Air, estão incluídas várias entradas extras relacionadas ao mDNS. Por exemplo:
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
Isso parece ser significativo. Curiosamente, o tempo limite listado acima é aproximadamente o mesmo que os tempos de execução acima.
Devo observar que estou conectado à Internet usando Wi-Fi e o problema só existe ao tentar resolver o nome do host do meu computador.
ping my_ISP_DNS_server
& básicoping Google_DNS_server
?