หลายเดือนที่ผ่านมาฉันสังเกตเห็นว่าโปรแกรมแก้ไขข้อความ (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
ดูเหมือนว่าความล่าช้ากำลังรอให้คิวรี DNS หมดเวลา ผลลัพธ์ข้างต้นกำลังใช้เซิร์ฟเวอร์ DNS สาธารณะของ Google ถ้าฉันใช้เซิร์ฟเวอร์ DNS ของ ISP เวลาจะเพิ่มเป็น 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
& amp;ping Google_DNS_server
?