我注意到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
正如您所看到的,使用 eth0
的root命名空间和使用 eth1
的robots命名空间之间的 time_namelookup
存在显着差异 .
我在 /etc/resolv.conf
中交换了2个名称服务器条目,这减少了机器人名称空间内的名称查找时间 . 我也试过ping,这导致了相同的时差 .
这一切都让我得出结论,默认情况下Linux内的DNS解析是顺序的 . 是否有一个原因?为什么不并行解析DNS?并且正确的解决方案是运行能够并行解析的本地递归DNS服务器吗?
(顺便说一下,这是用于卷曲的格式https://gist.githubusercontent.com/spiermar/8888552/raw/efc0b09699b0fd619eb32638d4f1099db528fe54/curl-format)