Warum dauert die Auflösung meines Hostnamens so lange?

16

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 hostinfodauert 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.

user67590
quelle
Willkommen an Bord Nr. 67590. Bitte geben Sie in Ihrer Frage an, wie Ihr MBP mit dem Internet verbunden ist (Ethernet, Wi-Fi, Bluetooth…). Haben Sie ein einfaches ping my_ISP_DNS_server& ausprobiert ping Google_DNS_server?
Dan

Antworten:

13

Ich konnte dieses Problem beheben, indem ich den HostNameusing- scutilWert explizit auf den folgenden Wert einstellte LocalHostName:

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

Jetzt:

$ 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

Ich war vorher aus folgendem Grund verwirrt:

$ scutil --get LocalHostName
MacBook-Pro

$ hostname
MacBook-Pro.local

Aber:

$ scutil --get HostName
HostName: not set
user67590
quelle
Wie in der anderen Antwort angegeben , scheint es so, als ob dies nicht nur behoben werden muss, sondern es muss .localauch (oder vielleicht nur .allgemein) enthalten sein.
Keith Smiley
4

Ich hatte ursprünglich das gleiche Problem, löste es aber schließlich.

Ich hatte mal:

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

Dann habe ich geändert:

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

Dann fügte ich hinzu: /etc/hosts

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

Es wurde schnell.

Michael Kim
quelle
2

Hatte das gleiche Problem, aber Ihre Vorschläge haben bei mir nicht funktioniert.

Schließlich habe ich es behoben, indem ich dies getan habe:

sudo scutil --set HostName uranus.local

Mein Maschinenhost ist "Uranus". Ich musste nur '.local' hinzufügen.

bstst
quelle