Статьи

InetAddressImpl # lookupAllHostAddr медленно / зависает

С тех пор, как я перешел на Yosemite, я заметил, что попытки разрешить локальный хост в моей домашней сети занимали много времени (иногда более минуты), поэтому я решил попробовать и выяснить, почему.

Вот как выглядел мой исходный файл / etc / hosts, исходя из предположения, что имя хоста моей машины было teetotal :

01
02
03
04
05
06
07
08
09
10
11
12
13
$ cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost
#fe80::1%lo0    localhost
127.0.0.1   wuqour.local
127.0.0.1       teetotal

Я настроил небольшой тест, который повторил проблему:

01
02
03
04
05
06
07
08
09
10
11
12
13
import java.net.InetAddress;
import java.net.UnknownHostException;
  
public class LocalhostResolution
{
    public static void main( String[] args ) throws UnknownHostException
    {
        long start = System.currentTimeMillis();
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
        System.out.println(System.currentTimeMillis() - start);
    }
}

который имеет следующий вывод:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
Exception in thread "main" java.net.UnknownHostException: teetotal-2: teetotal-2: nodename nor servname provided, or not known
    at java.net.InetAddress.getLocalHost(InetAddress.java:1473)
    at LocalhostResolution.main(LocalhostResolution.java:9)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.net.UnknownHostException: teetotal-2: nodename nor servname provided, or not known
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1469)
    ... 6 more

Каким-то образом мое имя хоста изменилось на teetotal-2, поэтому я добавил следующую запись в / etc / hosts :

1
127.0.0.1   teetotal-2

Теперь, если мы запустим программу, мы увидим этот вывод:

1
2
teetotal-2/127.0.0.1
5011

Это все еще занимает 5 секунд, чтобы решить, что намного дольше, чем я ожидал. После перерыва, указывающего на код, кажется, что он пытается выполнить разрешение IPv6, а не IPv4, поэтому я добавил для этого также запись / etc / hosts :

1
::1             teetotal-2

Теперь разрешение гораздо быстрее:

1
2
teetotal-2/127.0.0.1
6

Счастливые дни!