Tại sao độ phân giải tên máy chủ của tôi mất nhiều thời gian?


16

Vài tháng trước tôi nhận thấy rằng trình soạn thảo văn bản của tôi (emacs) và IDE (IntelliJ) đã mất một thời gian rất dài để khởi động. Thời gian dường như thay đổi dựa trên các máy chủ DNS mà OS X đang sử dụng.

Tôi đã có thể cách ly vấn đề khi bộ kiểm thử của dự án đang chạy chậm. Tôi tìm thấy thủ phạm (cấp cao hơn) là một cuộc gọi đến socket.getfqdn().

Chạy lệnh sau trong thiết bị đầu cuối trên OS X 10.10.2, thể hiện vấn đề:

$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()'  0.02s user 0.00s system 0% cpu 5.122 total

Tôi đã theo dõi mã chạy khi socket.getfqdn()được gọi và sự chậm trễ là do getaddrinfo(3). Tôi đã viết một chương trình nhỏ để cô lập vấn đề và gai_strerror(3)cung cấp thông báo này:

$ 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

Có vẻ như sự chậm trễ đang chờ truy vấn DNS hết thời gian. Các kết quả trên đã sử dụng các máy chủ DNS công cộng của Google. Tuy nhiên, nếu tôi sử dụng máy chủ DNS của ISP, thời gian sẽ tăng lên 30 giây:

$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()'  0.01s user 0.01s system 0% cpu 30.114 total

(tò mò chương trình C hostinfovẫn chỉ mất hơn 5 giây)

Điều gì gây ra vấn đề này? Là tên máy chủ của tôi không hợp lệ hoặc gây ra vấn đề?

$ hostname
MacBook-Pro.local

Vấn đề này không xảy ra trên Macbook Air trên cùng một mạng.

Sự khác biệt chính mà tôi có thể thấy là trên máy gặp sự cố, phân loại DNS sau được liệt kê:

$ 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

Trên Macbook Air, một số mục bổ sung được bao gồm liên quan đến mDNS. Ví dụ:

resolver #2
  domain   : local
  options  : mdns
  timeout  : 5
  flags    : Request A records
  order    : 300000

Điều này có vẻ là đáng kể. Thật thú vị, thời gian chờ được liệt kê ở trên là giống như thời gian chạy ở trên.

Tôi nên lưu ý rằng tôi đã kết nối với internet bằng WiFi và sự cố chỉ tồn tại khi cố gắng giải quyết tên máy chủ của máy tính của tôi.


Chào mừng bạn trên tàu n ° 67590. Vui lòng thêm vào câu hỏi của bạn làm thế nào MBP của bạn được kết nối với Internet (Ethernet, Wi-Fi, Bluetooth,). Bạn đã thử một cơ bản ping my_ISP_DNS_server& ping Google_DNS_server?
dan

Câu trả lời:


13

Tôi đã có thể khắc phục vấn đề này bằng cách đặt rõ ràng việc HostNamesử dụng scutilthành giá trị tương tự như LocalHostName:

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

Hiện nay:

$ 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

Tôi đã bối rối trước đây vì những điều sau đây:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Nhưng:

$ scutil --get HostName
HostName: not set

Như đã nêu trong câu trả lời khác , có vẻ như để khắc phục điều này không chỉ phải được đặt mà còn phải chứa .localcả (hoặc có thể chỉ là .nói chung).
Keith Smiley

4

Ban đầu tôi có cùng một vấn đề, nhưng cuối cùng đã giải quyết nó.

Tôi từng có:

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

Sau đó, tôi đã thay đổi:

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

Sau đó tôi thêm vào: /etc/hosts

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

Nó trở nên nhanh chóng.


2

Có cùng một vấn đề, nhưng đề xuất của bạn đã không làm việc cho tôi.

Cuối cùng, tôi đã sửa nó bằng cách làm điều này một khi tôi đã làm điều này:

sudo scutil --set HostName uranus.local

Máy chủ của tôi là 'uranus'. Tôi chỉ phải thêm '.local' vào nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.