कई महीने पहले मैंने देखा कि मेरे पाठ संपादक (emacs) और IDE (IntelliJ) को शुरू होने में बहुत लंबा समय लग रहा था। DNS सर्वर OS 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
ऐसा लगता है कि डीएनएस की क्वेरी का समय समाप्त होने का इंतजार हो रहा है। उपरोक्त परिणाम Google के सार्वजनिक DNS सर्वर का उपयोग कर रहे थे। यदि मैं अपने ISP के 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
(उत्सुकता से सी कार्यक्रम hostinfo
अभी भी 5 सेकंड से ऊपर लेता है)
इस समस्या का कारण क्या है? क्या मेरा होस्टनाम अमान्य है या समस्याएँ पैदा कर रहा है?
$ hostname
MacBook-Pro.local
यह समस्या उसी नेटवर्क पर मैकबुक एयर पर नहीं होती है।
मुख्य अंतर जो मैं देख सकता हूं वह यह है कि समस्याग्रस्त मशीन पर, निम्नलिखित डीएनएस कन्फ्यूजन सूचीबद्ध है:
$ 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
मैकबुक एयर पर, कई अतिरिक्त प्रविष्टियों को शामिल किया गया है जो mDNS से संबंधित हैं। उदाहरण के लिए:
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
यह महत्वपूर्ण प्रतीत होता है। दिलचस्प है, ऊपर सूचीबद्ध टाइमआउट ऊपर के रनटाइम के समान है।
मुझे ध्यान देना चाहिए कि मैं वाईफाई का उपयोग करके इंटरनेट से जुड़ा हुआ हूं और मेरे कंप्यूटर के होस्ट नाम को हल करने का प्रयास करते समय समस्या केवल मौजूद है।
ping my_ISP_DNS_server
और कोशिश कीping Google_DNS_server
?