ホスト名の解決に時間がかかるのはなぜですか?


16

数ヶ月前、テキストエディター(emacs)とIDE(IntelliJ)の起動に非常に時間がかかっていることに気付きました。この時間は、OS Xが使用していたDNSサーバーによって異なるように見えました。

プロジェクトのテストスイートの実行が遅いときに問題を特定できました。(より高いレベルの)犯人がの呼び出しであることがわかりました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クエリがタイムアウトするのを遅延が待っているようです。上記の結果は、GoogleのパブリックDNSサーバーを使用していました。ただし、ISPのDNSサーバーを使用すると、時間が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を使用してインターネットに接続しているため、コンピューターのホスト名を解決しようとしたときにのみ問題が発生することに注意してください。


ようこそ、ボード番号67590。MBPがどのようにインターネットに接続されているか(イーサネット、Wi-Fi、Bluetooth…)を質問に追加してください。基本的なping my_ISP_DNS_server&を試しましたping Google_DNS_serverか?
ダン

回答:


13

HostNameusing 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、同様に含む必要があるだけでなく、これを修正するように思われます(または.一般的には単に)。
キーススマイリー

4

もともと同じ問題を抱えていましたが、最終的には解決しました。

私はかつて持っていた:

$ 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

私のマシンのホストは「uranus」です。'.local'を追加するだけで済みました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.