数ヶ月前、テキストエディター(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を使用してインターネットに接続しているため、コンピューターのホスト名を解決しようとしたときにのみ問題が発生することに注意してください。
ping my_ISP_DNS_server
&を試しましたping Google_DNS_server
か?