As pesquisas de DNS reverso no Windows bloqueiam por vários segundos para endereços IP não resolvíveis
Eu estou usando JavaInetAddress.getHostName()
para executar algumas pesquisas reversas de DNS e algo parece errado com o tempo que leva. Aqui está um trecho de código:
public static void main(String[] args) throws IOException {
byte[][] addresses = new byte[][] { { 10, (byte) 0, (byte) 0, (byte) 138 }
, new byte[] { (byte) 216, (byte) 239, (byte) 49, (byte) 245 }
,{ 8, (byte) 8, (byte) 8, (byte) 8 } };
for (byte[] addr : addresses) {
InetAddress inet = InetAddress.getByAddress(addr);
long before = System.currentTimeMillis();
String hostName = inet.getHostName();
System.out.printf("%20s %40s %5d\n", inet.getHostAddress(), hostName, (System.currentTimeMillis() - before));
}
}
E aqui está a saída na minha máquina:
10.0.0.138 10.0.0.138 4503
216.239.49.245 216.239.49.245 4591
8.8.8.8 google-public-dns-a.google.com 8
A resolução de 10.0.0.138 e 216.239.49.245 leva 4,5 segundos cada, independentemente do número de vezes que eu executei esse código. Isso parece acontecer com todos os endereços IP não resolvidos.
Este não é um problema de rede, pois, de acordo com uma captura do wireshark, as consultas DNSnem são enviados quando este código é executadoa menos que o cache DNS seja limpo primeiro (e os resultados são ainda mais lentos - cerca de 4,7 segundos por resolução).
Então, na verdade, o Java leva 4,5 segundos para atingir o tempo limite no cache DNS local do sistema operacional? Isso não faz sentido. O utilitário de linha de comandonslookup
retorna resultados (não resolvíveis) para esses endereços IP muito mais rapidamente e nem sequer usa o cache!
Alguém pode explicar esse comportamento e sugerir uma maneira de acelerar essas resoluções? A única coisa em que consigo pensar sem recorrer a bibliotecas externas é usar vários threads, pelo menos o tempo limite de 4,5 segundos será executado em paralelo.
Para referência, estou usando o JDK 7u71 no Windows 7 x64
Edit1: este pergunta parece relevante, mas a resposta não diz que o desempenho depende da rede, que não é o que eu observei.
Edit2:
Este parece ser um problema do Windows. Uma máquina na mesma LAN, que usa exatamente o mesmo DNS, executando o OpenSuse 13.1 com JDK 1.7u67, retornou os seguintes resultados:
Sem cache do DNS:
10.0.0.138 10.0.0.138 116
216.239.49.245 216.239.49.245 5098
8.8.8.8 google-public-dns-a.google.com 301
Com cache de DNS:
10.0.0.138 10.0.0.138 5
216.239.49.245 216.239.49.245 9
8.8.8.8 google-public-dns-a.google.com 40
Edit3:
Eventualmente, eu tive que contornar o problema fazendo minhas próprias pesquisas reversas no DNS usandodnsjava.