Почему разрешение моего имени хоста занимает так много времени?


16

Несколько месяцев назад я заметил, что моему текстовому редактору (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, и проблема существует только при попытке определить имя хоста моего компьютера.


Добро пожаловать на борт № 67590. Пожалуйста, добавьте в свой вопрос, как ваш MBP подключен к Интернету (Ethernet, Wi-Fi, Bluetooth ...). Вы пробовали основные ping my_ISP_DNS_server& ping Google_DNS_server?
дан

Ответы:


13

Я смог решить эту проблему, явно указав для HostNameиспользования scutilзначение, равное LocalHostName:

$ scutil --set HostName $(scutil --get LocalHostName)

Сейчас:

$ sudo scutil --set HostName MacBook-Pro
$ time python -c 'import socket; print(socket.getfqdn())'
MacBook-Pro
python -c 'import socket; print(socket.getfqdn())'  0.01s user 0.00s system 86% cpu 0.016 total

Я был смущен раньше из-за следующего:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Но:

$ scutil --get HostName
HostName: not set

Как указано в другом ответе, кажется, что это нужно исправить: не только он должен быть установлен, но и содержать его .local(или, может быть, просто .вообще).
Кит Смайли,

4

У меня изначально была такая же проблема, но в конце концов она была решена.

Раньше, у меня был:

$ scutil --get HostName
Michaels-Macbook-Pro
$ scutil --get LocalHostName
Michaels-Macbook-Pro
$ time python -c 'import socket; socket.getfqdn()'
... 30s ...

Затем я изменил:

$ scutil --set HostName Michaels-Macbook-Pro.local
$ time python -c 'import socket; socket.getfqdn()'
... 5s ...

Затем я добавил в: /etc/hosts

127.0.0.1       localhost Michaels-Macbook-Pro.local
::1             localhost Michaels-Macbook-Pro.local

Стало быстро.


2

Была такая же проблема, но ваши предложения не сработали для меня.

В конце концов, я исправил это, выполнив следующее:

sudo scutil --set HostName uranus.local

Хозяин моей машины - «Уран». Мне нужно было только добавить «.local» к нему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.