DNS 数据结果返回慢分析
背景
有用户报障, 启动服务时候发现十分慢,感觉是 DNS 服务器问题第一时间给我感觉 DNS 没问题,但也分析一下
DNS 架构
当前使用 skydns 作为 DNS 解析服务器 (老旧系统遗留问题)DNS 数据存储至 3 台 ETCD 服务器集群中skydns 只解析 vpaas.org 域,其他域解析则转发至其他服务器
DNS 现象
在普通 VM 执行 dns 查询并没有发现有什么问题但客户电脑上执行 dns 解析的确有点慢参考下图每次 DNS 解析都需要 4 ~ 5 秒的返回时间

tcpdump 抓包分析
由于容器没有 tcpdump 命令直接到 dns 服务器上执行抓包操作参考抓包命令 (10.189.56.67) 客户端地址,请求 DNS 解析
tcpdump -i any host 10.189.56.67 and port 53 -w /tmp/dns.pcap
分析结果
参考下面命令,分析 dns.pcap ,每个请求时间返回针对第一次的 DNS 请求
# tshark -r dns.pcap -Y "dns.qry.name contains cfg-zk-1" -o tcp.calculate_timestamps:true
> -T fields -e frame.number -e frame.time_delta_displayed
> -e ip.src -e ip.dst -e dns.flags.response -e dns.qry.name -e dns.a
Running as user "root" and group "root". This could be dangerous.
54 0.000000000 10.189.56.67 10.199.197.222 0 cfg-zk-1.vip.com.vmock.t13208.vpaas.org
55 0.000358000 10.199.197.222 10.189.56.67 0 cfg-zk-1.vip.com.vmock.t13208.vpaas.org
67 2.000226000 10.199.197.222 10.189.56.67 0 cfg-zk-1.vip.com.vmock.t13208.vpaas.org
82 2.000243000 10.199.197.222 10.189.56.67 1 cfg-zk-1.vip.com.vmock.t13208.vpaas.org
87 1.001264000 10.189.56.67 10.199.197.222 0 cfg-zk-1.vip.com.t13208.vpaas.org
88 0.001542000 10.199.197.222 10.189.56.67 1 cfg-zk-1.vip.com.t13208.vpaas.org
89 0.001735000 10.189.56.67 10.199.197.222 0 cfg-zk-1.vip.com
90 0.002192000 10.199.197.222 10.189.56.67 1 cfg-zk-1.vip.com
91 0.000471000 10.189.56.67 10.199.197.222 0 cfg-zk-1.vip.com
92 0.001538000 10.199.197.222 10.189.56.67 1 cfg-zk-1.vip.com
93 0.000316000 10.189.56.67 10.199.197.222 0 cfg-zk-1.vip.com
94 0.001164000 10.199.197.222 10.189.56.67 1 cfg-zk-1.vip.com
针对第二次的 DNS 请求
# tshark -r dns.pcap -Y "dns.qry.name contains cfg-zk-2" -o tcp.calculate_timestamps:true -T fields -e frame.number -e frame.time_delta_displayed -e ip.src -e ip.dst -e dns.flags.response -e dns.qry.name -e dns.a
Running as user "root" and group "root". This could be dangerous.
95 0.000000000 10.189.56.67 10.199.197.222 0 cfg-zk-2.vip.com.vmock.t13208.vpaas.org
96 0.000708000 10.199.197.222 10.189.56.67 0 cfg-zk-2.vip.com.vmock.t13208.vpaas.org
104 2.000231000 10.199.197.222 10.189.56.67 0 cfg-zk-2.vip.com.vmock.t13208.vpaas.org
122 2.000298000 10.199.197.222 10.189.56.67 1 cfg-zk-2.vip.com.vmock.t13208.vpaas.org
123 0.000683000 10.189.56.67 10.199.197.222 0 cfg-zk-2.vip.com.t13208.vpaas.org
124 0.002016000 10.199.197.222 10.189.56.67 1 cfg-zk-2.vip.com.t13208.vpaas.org
125 0.001814000 10.189.56.67 10.199.197.222 0 cfg-zk-2.vip.com
126 0.001868000 10.199.197.222 10.189.56.67 1 cfg-zk-2.vip.com
127 0.000545000 10.189.56.67 10.199.197.222 0 cfg-zk-2.vip.com
128 0.002011000 10.199.197.222 10.189.56.67 1 cfg-zk-2.vip.com
129 0.000368000 10.189.56.67 10.199.197.222 0 cfg-zk-2.vip.com
130 0.001419000 10.199.197.222 10.189.56.67 1 cfg-zk-2.vip.com
分析说明
上面两次分析, 都请参考第二列(时间)第一次用时为 5 秒,第二次用时为 4 秒, 跟之前客户端时间返回匹配当用户请求域名 cfg-zk-2.vip.com 时syndns 收到请求, 会先 查询 ETCD 获取 cfg-zk-2.vip.com.vmock.t13208.vpaas.org 请求 耗时 2 秒当无法获取数据,则查询 ETCD 请求 cfg-zk-2.vip.com.t13208.vpaas.org 解析,耗时 2 秒当第二次数据返回失败,才转发请求到其他 DNS 服务器并返回数据至用户因此总耗时十分长
改进
skydns 对非本地域 (vpaas.org) DNS 请求不友好如果遇到非本地域请求,则会浪费耗时因为需要修改 DNS 架构可以用 bind 或 pdns-recursor 监听本地 53 端口, 并指定 vpaas.org 转发至 skydns 服务器解析bind, pdns-recursor 可以支持多域名分别处理,QPS 可以达到 10W/S 直接推荐