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

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

Это кажется значительным. Интересно, что указанный выше тайм-аут примерно такой же, как и предыдущие.

Я должен отметить, что я подключен к Интернету с помощью WiFi, и проблема возникает только при попытке решить имя хоста моего компьютера.

13 голосов | спросил user67590 4 MarpmWed, 04 Mar 2015 16:06:06 +03002015-03-04T16:06:06+03:0004 2015, 16:06:06

3 ответа


9

Я смог исправить эту проблему, явно установив 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
ответил user67590 7 MarpmSat, 07 Mar 2015 23:32:37 +03002015-03-07T23:32:37+03:0011 2015, 23:32:37
2

Имел ту же проблему, но ваши предложения не сработали для меня.

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

sudo scutil --set HostName uranus.local

Мой хост машины - «uranus». Мне нужно было добавить «.local».

ответил bstst 11 Jpm1000000pmMon, 11 Jan 2016 17:31:44 +030016 2016, 17:31:44
2

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

Я имел обыкновение иметь:

$ 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

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

ответил Michael Kim 25 62017vEurope/Moscow11bEurope/MoscowSat, 25 Nov 2017 03:42:00 +0300 2017, 03:42:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132