1、DNS解析失败

        1.1 报connection timed out; no servers could be reached错误

root@15b099c121e2:/# nslookup  time.geekbang.org
;; connection timed out; no servers could be reached

        1.2 对网络进行排查,或者是使用 nslookup -debug www.baidu.com。结果发现网络是征程连接的,但是访问baidu这个网址取通过本机环回口取访问的,所以导致连接失败。

root@15b099c121e2:/# ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114): 56 data bytes
64 bytes from 114.114.114.114: icmp_seq=0 ttl=127 time=29.275 ms
64 bytes from 114.114.114.114: icmp_seq=1 ttl=127 time=27.183 ms
^C--- 114.114.114.114 ping statistics 
root@15b099c121e2:/# nslookup -debug www.baidu.com
;; Connection to 127.0.0.1#53(127.0.0.1) for www.baidu.com failed: connection refused.
;; Connection to ::1#53(::1) for www.baidu.com failed: address not available.

        1.3 查看Dns配置文件,发现内容为空。所以我们需要配置DNS服务

/# cat /etc/resolv.conf
root@15b099c121e2:/# echo "nameserver 114.114.114.114 " > /etc/resolv.conf
root@15b099c121e2:/# nslookup www.baidu.com
Server:		114.114.114.114
Address:	114.114.114.114#53
Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 14.215.177.39
Name:	www.a.shifen.com
Address: 14.215.177.38

2、DNS解析不稳定

        2.1 用time nslookup  mp.csdn.net为例,来查看时延,可以看到real这一栏的时延有15S之久

harbo@harbo-virtual-machine:~$ time  nslookup  mp.csdn.net
Server:		114.114.114.114
Address:	114.114.114.114#53
Non-authoritative answer:
Name:	mp.csdn.net
Address: 101.201.178.55
real	0m15.099s
user	0m0.000s
sys	0m0.013s

        2.2 如果多测试一下,会出现哪些现象呢,可能也会出现解析失败的现象

/# time nslookup mp.csdn.net
;; connection timed out; no servers could be reached
real  0m15.011s
user  0m0.006s
sys  0m0.006s

        2.3 对于上述出现的结果,可能会出现多种原因:

                2.3.1 DNS服务器本身有问题,响应慢并且不稳定

                2.3.2 客户端到DNS服务器的网络延迟比较大

                2.3.3 DNS请求或者响应包,在某些情况下请求包被丢弃

        2.4 根据不同的延时,我们可以更换不同的DNS,使用ping命令进行观测

arbo@harbo-virtual-machine:~$ ping  mp.csdn.net
PING mp.csdn.net (101.201.178.55) 56(84) bytes of data.
64 bytes from 101.201.178.55 (101.201.178.55): icmp_seq=1 ttl=128 time=38.4 ms
64 bytes from 101.201.178.55 (101.201.178.55): icmp_seq=2 ttl=128 time=34.5 ms

        2.5 针对DNS解析时间过长的问题,可以为目标进行DNS缓存,使用dnsmasq

#该命令是在容器上执行
/# /etc/init.d/dnsmasq start
 * Starting DNS forwarder and DHCP server dnsmasq                    [ OK ]

        2.6 修改/etc/resolv.conf,将DNS服务器改为DNSmasq的监听地址,本次用的是本机地址 114.114.114.114,然后多次执行nslookup命令

root@a7e78e494a4d:/# time nslookup mp.csdn.net
Server:		114.114.114.114
Address:	114.114.114.114#53
Non-authoritative answer:
Name:	mp.csdn.net
Address: 101.201.178.55
real	0m0.115s
user	0m0.011s
sys	0m0.026s

        2.7 可以看到执行多次以后,DNS解析都比较快。

2、DNS优化解决方法

        2.1 对DNS解析结果进行缓存,但是要注意,缓存过期以后,需要重新获取新纪录,有经验的小伙伴可以写一个脚本,定期进行获取新记录。

        2.2 对DNS解析的结果进行预取,这是浏览器等 Web 应用中最常用的方法,也就是说,不等用户点击页面上的超链接,浏览器就会在后台自动解析域名,并把结果缓存起来。

        2.3 使用HTTPDNS取代常规的DNS解析,特别是如今域名劫持普遍存在,使用 HTTP 协议绕过链路中的 DNS 服务器,就可以避免域名劫持的问题

       2.4 基于 DNS 的全局负载均衡(GSLB)。这不仅为服务提供了负载均衡和高可用的功能,还可以根据用户的位置,返回距离最近的 IP 地址。

本文整理自极客时间 倪朋飞:《Linux性能优化实战》