Несколько месяцев назад я заметил, что моему текстовому редактору (emacs) и IDE (IntelliJ) потребовалось очень много времени для запуска. Время варьировалось в зависимости от DNS-серверов, которые использовала OS X.
Мне удалось изолировать проблему, когда тестовый пакет проекта работал медленно. Я обнаружил, что виновником (более высокого уровня) является призыв socket.getfqdn()
.
Выполнение следующей команды в терминале на OS X 10.10.2, демонстрирует проблему:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.02s user 0.00s system 0% cpu 5.122 total
Я проследил код, который запускается, когда socket.getfqdn()
вызывается, и задержка вызвана getaddrinfo(3)
. Я написал небольшую программу, которая изолирует проблему и gai_strerror(3)
предоставляет следующее сообщение:
$ 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
Похоже, что задержка ожидания DNS-запроса истекает. Выше были результаты использования общедоступных DNS-серверов Google. Однако, если я использую DNS-серверы моего провайдера, время увеличивается до 30 секунд:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.01s user 0.01s system 0% cpu 30.114 total
(любопытно, что программа C hostinfo
все еще занимает чуть более 5 секунд)
Что вызывает эту проблему? Неверное имя моего хоста или проблемы?
$ hostname
MacBook-Pro.local
Эта проблема не возникает на Macbook Air в той же сети.
Основное различие, которое я вижу, состоит в том, что на проблемной машине указана следующая конфигурация 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
В Macbook Air включены несколько дополнительных записей, относящихся к mDNS. Например:
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
Это кажется значительным. Интересно, что время ожидания, указанное выше, примерно такое же, как и время выполнения выше.
Я должен отметить, что я подключен к Интернету через Wi-Fi, и проблема существует только при попытке определить имя хоста моего компьютера.
ping my_ISP_DNS_server
&ping Google_DNS_server
?