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 hostinfo
masih 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.
ping my_ISP_DNS_server
&ping Google_DNS_server
?