我注意到Linux默认情况下似乎有串行/同步DNS解析而不是并行/异步DNS解析。
我在Virtualbox中使用2个网络适配器(eth0
,eth1
)进行了测试,一个用于NAT,另一个是连接到公共互联网的家用路由器的桥接网络。这给了我2个DNS服务器,一个来自VirtualBox NAT,另一个是我的家庭网络路由器的DNS。
这是我的/etc/resolv.conf
:
vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.2.3
nameserver 10.1.1.1
然后我尝试使用eth0
在我的根命名空间中联系谷歌两次,并在使用网桥eth1
的网络命名空间中两次联系:
vagrant@vagrant-ubuntu-trusty-64:~$ curl -w "@timing_curl" -o /dev/null -s http://google.com
time_namelookup: 0.004
time_connect: 0.030
time_appconnect: 0.000
time_pretransfer: 0.031
time_redirect: 0.000
time_starttransfer: 0.066
----------
time_total: 0.067
vagrant@vagrant-ubuntu-trusty-64:~$ curl -w "@timing_curl" -o /dev/null -s http://google.com
time_namelookup: 0.004
time_connect: 0.032
time_appconnect: 0.000
time_pretransfer: 0.032
time_redirect: 0.000
time_starttransfer: 0.065
----------
time_total: 0.065
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip netns exec robots curl -w "@timing_curl" -o /dev/null -s http://google.com
time_namelookup: 10.530
time_connect: 10.560
time_appconnect: 0.000
time_pretransfer: 10.560
time_redirect: 0.000
time_starttransfer: 10.594
----------
time_total: 10.594
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip netns exec robots curl -w "@timing_curl" -o /dev/null -s http://google.com
time_namelookup: 5.519
time_connect: 5.548
time_appconnect: 0.000
time_pretransfer: 5.548
time_redirect: 0.000
time_starttransfer: 5.582
----------
time_total: 5.583
正如您所看到的,使用time_namelookup
的根命名空间与使用eth0
的漫游器命名空间之间的eth1
存在显着差异。
我在/etc/resolv.conf
中交换了2个名称服务器条目,这减少了机器人名称空间内的名称查找时间。我也尝试使用ping,这导致了相同的时间差异。
这一切都让我得出结论,默认情况下Linux内的DNS解析是顺序的。是否有一个原因?为什么不并行解析DNS?并且正确的解决方案是运行能够并行解析的本地递归DNS服务器吗?
(顺便说一句,这是用于卷曲https://gist.githubusercontent.com/spiermar/8888552/raw/efc0b09699b0fd619eb32638d4f1099db528fe54/curl-format)
的格式