Mengapa resolusi nama host saya begitu lama?

16

Beberapa bulan yang lalu saya perhatikan bahwa editor teks saya (emacs) dan IDE (IntelliJ) membutuhkan waktu yang sangat lama untuk memulai. Waktu tampaknya bervariasi berdasarkan pada server DNS yang digunakan OS X.

Saya dapat mengisolasi masalah ini ketika test suite proyek berjalan lambat. Saya menemukan pelakunya (tingkat yang lebih tinggi) untuk dipanggil socket.getfqdn().

Menjalankan perintah berikut di terminal pada OS X 10.10.2, menunjukkan masalahnya:

$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()'  0.02s user 0.00s system 0% cpu 5.122 total

Saya melacak kode yang berjalan saat socket.getfqdn()dipanggil dan penundaan disebabkan oleh getaddrinfo(3). Saya menulis sebuah program kecil yang mengisolasi masalah dan gai_strerror(3)memberikan pesan ini:

$ 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

Sepertinya penundaan sedang menunggu permintaan DNS habis. Hasil di atas menggunakan server DNS publik Google. Namun, jika saya menggunakan server DNS ISP saya, waktu bertambah menjadi 30 detik:

$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()'  0.01s user 0.01s system 0% cpu 30.114 total

(anehnya program C hostinfomasih membutuhkan waktu di atas 5 detik)

Apa yang menyebabkan masalah ini? Apakah nama host saya tidak valid atau menyebabkan masalah?

$ hostname
MacBook-Pro.local

Masalah ini tidak terjadi pada Macbook Air di jaringan yang sama.

Perbedaan utama yang saya lihat adalah pada mesin yang bermasalah, konfigurasi DNS berikut tercantum:

$ 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

Di Macbook Air, beberapa entri tambahan disertakan yang terkait dengan mDNS. Sebagai contoh:

resolver #2
  domain   : local
  options  : mdns
  timeout  : 5
  flags    : Request A records
  order    : 300000

Ini sepertinya penting. Menariknya, batas waktu yang tercantum di atas hampir sama dengan runtime di atas.

Saya harus mencatat bahwa saya terhubung ke internet menggunakan WiFi dan masalahnya hanya ada ketika mencoba menyelesaikan nama host komputer saya.

pengguna67590
sumber
Selamat datang di papan n ° 67590. Silakan tambahkan pertanyaan Anda bagaimana MBP Anda terhubung ke Internet (Ethernet, Wi-Fi, Bluetooth ...). Apakah Anda mencoba dasar ping my_ISP_DNS_server& ping Google_DNS_server?
dan

Jawaban:

13

Saya bisa memperbaiki masalah ini dengan menetapkan secara eksplisit HostNamemenggunakan scutilnilai yang sama dengan LocalHostName:

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

Sekarang:

$ 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

Saya bingung sebelumnya karena hal berikut:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Tapi:

$ scutil --get HostName
HostName: not set
pengguna67590
sumber
Seperti yang dinyatakan dalam jawaban lain sepertinya memperbaiki ini tidak hanya harus diatur tetapi harus mengandung .localjuga (atau mungkin hanya secara .umum).
Keith Smiley
4

Saya awalnya memiliki masalah yang sama, tetapi akhirnya menyelesaikannya.

Saya pernah mempunyai:

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

Lalu saya berubah:

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

Lalu saya menambahkan: /etc/hosts

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

Itu menjadi cepat.

Michael Kim
sumber
2

Punya masalah yang sama, tetapi saran Anda tidak berhasil untuk saya.

Akhirnya, saya memperbaikinya dengan melakukan ini setelah saya melakukan ini:

sudo scutil --set HostName uranus.local

Tuan rumah mesin saya adalah 'uranus'. Saya hanya perlu menambahkan '.local' ke sana.

pertama
sumber