Linux网络栈基于了TCP/IP协议栈构建,在不同的层级,关注的网络性能不尽相同

在应用层,关注的是应用程序的并发数,每秒请求数,处理延迟,错误数利用wrk JMeter等,进行模拟负载,获得测试结果

传输层,则是TCP UDP等传输层的协议,TCP连接数等,使用iperf netperf等,进行测试

再到了下层,就是网络层,即为PPS,Linux自带的pktgen,进行测试这个指标

今天,我们拿DNS,来进行测试网络相关的问题

DNS相比不用说,域名系统,提供域名和IP之间的映射关系的查询服务

域名是全球唯一的,由一串用点分割的字符组成,用于区分互联网中某一台或者一组计算机的分别

比如time.geekbang.org

这里面org是顶级的域名,geekbang为二级域名 time为三级域名

图片

DNS的解析基于UDP和TCP,多数为UDP,域名服务器舰艇在端口53上

既然域名以分层的结构进行管理,相对应的,域名解析其实也是递归的方式,每个层级的域名服务器进行递归解析,知道得到结果

对于本机去请求哪个域名服务器,获得结果,可以利用如下的命令

cat /etc/resolv.conf

nameserver 114.114.114.114

而且,DNS域名解析的结果,可以进行缓存,支持A CNAME MX NS PTR等多种类型

A记录,将域名转为IP

CNAME记录 创建别名

NS记录 表示域名对应的域名服务器地址

和实际场景一结合,就是查询这个域名的IP地址,然后通过IP进行访问Web

而NS记录,可以利用UNIX的uslookup命令进行拆线呢

$ nslookup time.geekbang.org

# 域名服务器及端口信息

Server:    114.114.114.114

Address:  114.114.114.114#53

# 非权威查询结果

Non-authoritative answer:

Name:  time.geekbang.org

Address: 39.106.233.17

我们获取到了114返回的非权威结果

毕竟114并非权威域名服务器

如果想要查看递归结果,我们可以使用DNS的解析工具dig

# +trace表示开启跟踪查询

# +nodnssec表示禁止DNS安全扩展

$ dig +trace +nodnssec time.geekbang.org

; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> +trace +nodnssec time.geekbang.org

;; global options: +cmd

.      322086  IN  NS  m.root-servers.net.

.      322086  IN  NS  a.root-servers.net.

.      322086  IN  NS  i.root-servers.net.

.      322086  IN  NS  d.root-servers.net.

.      322086  IN  NS  g.root-servers.net.

.      322086  IN  NS  l.root-servers.net.

.      322086  IN  NS  c.root-servers.net.

.      322086  IN  NS  b.root-servers.net.

.      322086  IN  NS  h.root-servers.net.

.      322086  IN  NS  e.root-servers.net.

.      322086  IN  NS  k.root-servers.net.

.      322086  IN  NS  j.root-servers.net.

.      322086  IN  NS  f.root-servers.net.

;; Received 239 bytes from 114.114.114.114#53(114.114.114.114) in 1340 ms

org.      172800  IN  NS  a0.org.afilias-nst.info.

org.      172800  IN  NS  a2.org.afilias-nst.info.

org.      172800  IN  NS  b0.org.afilias-nst.org.

org.      172800  IN  NS  b2.org.afilias-nst.org.

org.      172800  IN  NS  c0.org.afilias-nst.info.

org.      172800  IN  NS  d0.org.afilias-nst.org.

;; Received 448 bytes from 198.97.190.53#53(h.root-servers.net) in 708 ms

geekbang.org.    86400  IN  NS  dns9.hichina.com.

geekbang.org.    86400  IN  NS  dns10.hichina.com.

;; Received 96 bytes from 199.19.54.1#53(b0.org.afilias-nst.org) in 1833 ms

time.geekbang.org.  600  IN  A  39.106.233.176

;; Received 62 bytes from 140.205.41.16#53(dns10.hichina.com) in 4 ms

从114中查询到根域名服务器的NS记录

然后选取一个根域名服务器,进行查询,然后递归往下走,基本流程如下

图片

对于局域网的DNS解析,可以使用本地的host文件,或者在局域网中搭建DNS服务器

说完了这些基本示例

查看出现了问题之后,如何进行定位

第一个:

首先是尝试执行DNS查询命令,利用的还是nslookup命令

nslookup time.geekbang.org

发现timeout错误了

看到这里,是不是网络不通了吗,是没有连接到114.114.114.114吗

我们尝试ping一下114

发现是可以正常ping的通的

这是不是因为我们的域名解析没有正常的连接到114上呢?在 etc/resolv.conf文件,配上DNS就可以了

执行下面的命令,再执行nslookup命令,就可以查看正常解析了

/# echo “nameserver 114.114.114.114” > /etc/resolv.conf

/# nslookup time.geekbang.org

Server:    114.114.114.114

Address:  114.114.114.114#53

Non-authoritative answer:

Name:  time.geekbang.org

Address: 39.106.233.176

第二个,DNS的解析不稳定问题

我们查看第二个案例,就是先运行nslookup命令,解析ip地址,不过这次nslookup前面需要加上time命令,查看时间

/# time nslookup time.geekbang.org

Server:    8.8.8.8

Address:  8.8.8.8#53

Non-authoritative answer:

Name:  time.geekbang.org

Address: 39.106.233.176

real  0m10.349s

user  0m0.004s

sys  0m0.0

这一次的解析,花费了10秒,这是为什么呢?

根据前面的讲解,我们现在明白,DNS的解析,就是一个UDP的包的发送和接收

那么解析不稳定的话,可能是DNS服务器本身有问题

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

或者是DNS请求到响应包,某些情况下,被链路的网络设备弄丢了

nslookup的输出,可以看出,客户端的连接DNS是8.8.8.8,是Google提供的DNS服务,那么首先排除DNS本身问题,那么是不是网络延迟

ping可以测试服务器的延迟,尝试ping一下

/# ping -c3 8.8.8.8

PING 8.8.8.8 (8.8.8.8): 56 data bytes

64 bytes from 8.8.8.8: icmp_seq=0 ttl=31 time=137.637 ms

64 bytes from 8.8.8.8: icmp_seq=1 ttl=31 time=144.743 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=31 time=138.576 ms

— 8.8.8.8 ping statistics —

3 packets transmitted, 3 packets received, 0% packet loss

round-trip min/avg/max/stddev = 137.637/140.319/144.743/3.152 ms

上面ping中的平均延迟高达140ms,这就是为何解析如此慢的原因了

我们尝试替换DNS服务器,再次进行解析nslookup解析命令

/# echo nameserver 114.114.114.114 > /etc/resolv.conf

/# time nslookup time.geekbang.org

Server:    114.114.114.114

Address:  114.114.114.114#53

Non-authoritative answer:

Name:  time.geekbang.org

Address: 39.106.233.176

real    0m0.064s

user    0m0.007s

sys     0m0.006s

这样,解析的时候很快了

但是多次运行nslookup,由时候的运行时间会长达1s

这种原因,可能是DNS没有走本地的缓存,而是每次都去请求DNS服务器了

这就需要我们为DNS开启缓存,即使用dnsmasq

常用的DNS缓存服务,作为DHCP服务来使用,安装和配置都比较简单,性能也可以满足绝大多数应用程序对DNS缓存的需求

我们尝试启动dnsmasq

/# /etc/init.d/dnsmasq start

* Starting DNS forwarder and DHCP server dnsmasq                    [ OK ]

然后将DNS服务器修改为dnsmasq的监听地址,比如127.0.0.1,进行执行nslookup命令

这样,就可以将DNS进行本地的缓存,方便快速的解析

今天,说明了DNS的基本原理,掌握了DNS的一些问题及分析思路

DNS提供了域名和IP间映射关系的查询服务,但是如果在请求的过程中,发现解析DNS需要等待至少1s,那么这就是实际应用上的一个维妮塔

对此,我们总结了几种常见的DNS优化方法

DNS结果进行缓存,但是需要注意缓存过期的问题,一旦过期,需要对DNS服务器继续重新获取,不过是可以接受的

DNS解析的结果进行预缓存,是浏览器等应用常用手段,可以不等用户点击超链接,而是后台默默的解析DNS

使用HTTPDNS取代常规DNS解析

基于DNS的全局负载均衡 GSLB,为服务提供了负载均衡和高可用功能

发表评论

邮箱地址不会被公开。 必填项已用*标注