Vor einigen Monaten bemerkte ich, dass mein Texteditor (Emacs) und meine IDE (IntelliJ) sehr lange brauchten, um hochzufahren. Die Zeit schien abhängig von den von OS X verwendeten DNS-Servern zu variieren.
Ich konnte das Problem eingrenzen, wenn die Testsuite eines Projekts langsam lief. Ich fand, dass der (höhere Ebene) Schuldige ein Anruf war socket.getfqdn()
.
Das Ausführen des folgenden Befehls im Terminal unter OS X 10.10.2 veranschaulicht das Problem:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.02s user 0.00s system 0% cpu 5.122 total
Ich habe den Code nachverfolgt, der ausgeführt wird, wenn socket.getfqdn()
aufgerufen wird und die Verzögerung durch verursacht wird getaddrinfo(3)
. Ich habe ein kleines Programm geschrieben, mit dem das Problem eingegrenzt und gai_strerror(3)
die folgende Meldung angezeigt wird:
$ 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
Anscheinend wartet die Verzögerung auf die Zeitüberschreitung der DNS-Abfrage. Bei den obigen Ergebnissen wurden die öffentlichen DNS-Server von Google verwendet. Wenn ich jedoch die DNS-Server meines Internetdienstanbieters verwende, erhöht sich die Zeit auf 30 Sekunden:
$ time python -c 'import socket; socket.getfqdn()'
python -c 'import socket; socket.getfqdn()' 0.01s user 0.01s system 0% cpu 30.114 total
(Kurioserweise hostinfo
dauert das C-Programm immer noch knapp über 5 Sekunden.)
Was verursacht dieses Problem? Ist mein Hostname ungültig oder verursacht er Probleme?
$ hostname
MacBook-Pro.local
Dieses Problem tritt bei einem Macbook Air im selben Netzwerk nicht auf.
Der Hauptunterschied besteht darin, dass auf dem problematischen Computer die folgende DNS-Konfiguration aufgeführt ist:
$ 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
Auf dem Macbook Air sind mehrere zusätzliche Einträge enthalten, die sich auf mDNS beziehen. Beispielsweise:
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
order : 300000
Dies scheint von Bedeutung zu sein. Interessanterweise entspricht das oben aufgeführte Timeout in etwa den oben angegebenen Laufzeiten.
Ich sollte beachten, dass ich über WLAN mit dem Internet verbunden bin und das Problem nur bei dem Versuch besteht, den Hostnamen meines Computers aufzulösen.
ping my_ISP_DNS_server
& ausprobiertping Google_DNS_server
?