ทำไมการแก้ไขชื่อโฮสต์ของฉันใช้เวลานานมาก


14

หลายเดือนที่ผ่านมาฉันสังเกตเห็นว่าโปรแกรมแก้ไขข้อความ (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 และมีปัญหาเฉพาะเมื่อพยายามแก้ไขชื่อโฮสต์ของคอมพิวเตอร์ของฉัน


ยินดีต้อนรับขึ้นเครื่อง n ° 67590 โปรดเพิ่มคำถามของคุณว่า MBP ของคุณเชื่อมต่อกับอินเทอร์เน็ตอย่างไร (Ethernet, Wi-Fi, Bluetooth ... ) คุณลองใช้เบสิคไหม ping my_ISP_DNS_server & amp; ping Google_DNS_server?
daniel Azuelos

คำตอบ:


10

ฉันสามารถแก้ไขปัญหานี้ได้โดยการตั้งค่า HostName การใช้ scutil เป็นค่าเดียวกับ LocalHostName:

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

ขณะนี้:

$ 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

ฉันสับสนมาก่อนเนื่องจากสิ่งต่อไปนี้:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

แต่:

$ scutil --get HostName
HostName: not set

ตามที่ระบุไว้ใน คำตอบอื่น ๆ ดูเหมือนว่าจะแก้ไขปัญหานี้ไม่เพียง แต่จะต้องตั้งค่า แต่ต้องมี .local เช่นกัน (หรืออาจจะแค่ . โดยทั่วไป)
Keith Smiley

3

ฉันเดิมมีปัญหาเดียวกัน แต่ในที่สุดก็แก้ไขได้

ฉันเคยมี:

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

จากนั้นฉันก็เปลี่ยน:

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

จากนั้นฉันเพิ่มเข้าไปใน: /etc/hosts

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

มันกลายเป็นเร็ว


2

มีปัญหาเดียวกัน แต่ข้อเสนอแนะของคุณใช้ไม่ได้สำหรับฉัน

ในที่สุดฉันแก้ไขโดยทำสิ่งนี้เมื่อฉันทำสิ่งนี้:

sudo scutil --set HostName uranus.local

โฮสต์เครื่องของฉันคือ 'ดาวยูเรนัส' ฉันแค่เพิ่ม '.local' ลงไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.