Чому дозвіл мого імені займає так довго?


14

Кілька місяців тому я помітив, що моєму текстовому редактору (emacs) та IDE (IntelliJ) потрібен дуже багато часу для запуску. Час, як видається, змінювався залежно від DNS-серверів, які ОС 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

Це здається суттєвим. Цікаво, що зазначений вище час очікування приблизно такий же, як і вище.

Слід зазначити, що я підключений до Інтернету за допомогою WiFi, і проблема існує лише при спробі вирішити ім'я хоста мого комп'ютера.


Ласкаво просимо на борт № 67590. Будь ласка, додайте до свого питання, як ваш MBP підключений до Інтернету (Ethernet, Wi-Fi, Bluetooth…). Ви спробували базовий ping my_ISP_DNS_server& ping Google_DNS_server?
дан

Відповіді:


11

Мені вдалося виправити цю проблему, чітко встановивши 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.