Birkaç ay önce, metin editörümün (emacs) ve IDE'nin (IntelliJ) başlaması gerçekten çok zaman alıyordu. OS X'in kullandığı DNS sunucularına göre zaman değişiyordu.
Bir projenin test takımı yavaş çalışıyorken sorunu çözmeyi başardım. (Yüksek seviye) suçluyu bir çağrı olarak buldum socket.getfqdn()
.
Terminal X OS 10.10.2’de aşağıdaki komutu çalıştırmak problemi gösterir:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.02s user 0.00s system 0% cpu 5.122 total
Çağrıldığında çalışan kodun izini sürdüm socket.getfqdn()
ve gecikmeye neden oluyor getaddrinfo(3)
. Sorunu izole eden ve gai_strerror(3)
şu mesajı sağlayan küçük bir program yazdım :
$ 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
Görünüşe göre gecikme, DNS sorgusunun zaman aşımına uğramasını bekliyor. Yukarıdaki sonuçlar Google’ın genel DNS sunucularını kullanıyordu. Ancak ISS’imin DNS sunucularını kullanırsam, süre 30 saniyeye çıkar:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.01s user 0.01s system 0% cpu 30.114 total
(merakla C programı hostinfo
hala 5 saniyenin üzerinde sürüyor)
Bu soruna ne sebep oluyor? Ana bilgisayar adım geçersiz mi veya sorunlara neden mi?
$ hostname
MacBook-Pro.local
Bu sorun aynı ağdaki Macbook Air'de gerçekleşmiyor.
Görebildiğim en büyük fark, sorunlu makinede, aşağıdaki DNS eşleşmesinin listelenmiş olmasıdır:
$ 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'de, mDNS ile ilgili birkaç ekstra giriş bulunur. Örneğin:
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
Bu önemli gibi görünüyor. İlginç bir şekilde, yukarıda listelenen zaman aşımı, yukarıdaki çalışma zamanları ile aynıdır.
WiFi kullanarak internete bağlı olduğumu ve yalnızca bilgisayarımın ana bilgisayar adını çözmeye çalışırken sorunun var olduğunu not etmeliyim.
ping my_ISP_DNS_server
&ping Google_DNS_server
?