Кілька місяців тому я помітив, що моєму текстовому редактору (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, і проблема існує лише при спробі вирішити ім'я хоста мого комп'ютера.
ping my_ISP_DNS_server
&ping Google_DNS_server
?