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 hostinfo
vẫ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.
ping my_ISP_DNS_server
&ping Google_DNS_server
?