为什么绑定比公共DNS服务提供商慢

我们已经绑定了ubuntu 12.04中的9.8.1.dfsg.P1-4ubuntu0.13,它运行在负载较重的服务器上(平均负载为0.19,0.12,0.13),并为macos和ubuntu工作站提供小型办公networking的服务请求。

我在dns服务器上运行的容器脚本中运行了一些dnstesting,并将结果推送到influxdb。

#!/bin/bash while true do rndc flush bind_timeout=$( dig @192.168.128.3 redhat.com | grep 'Query time' | awk '{ print $4 }' ) google_timeout=$( dig @8.8.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' ) yandex_timeout=$( dig @77.88.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' ) curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "bind,server=bind,without_cache=yes value=$bind_timeout" & curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "google,server=google,without_cache=yes value=$google_timeout" & curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "yandex,server=yandex,without_cache=yes value=$yandex_timeout" & wait bind_timeout=$( dig @192.168.128.3 redhat.com | grep 'Query time' | awk '{ print $4 }' ) google_timeout=$( dig @8.8.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' ) yandex_timeout=$( dig @77.88.8.8 redhat.com | grep 'Query time' | awk '{ print $4 }' ) curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "bind,server=bind,without_cache=no value=$bind_timeout" & curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "google,server=google,without_cache=no value=$google_timeout" & curl -i -XPOST 'http://ts.example.lab:8086/write?db=dnstest' -d "yandex,server=yandex,without_cache=no value=$yandex_timeout" & wait sleep 5 done 

我发现绑定的响应速度慢于8.8.8.877.88.8.8 。 这可以在图中看到:

在第一次请求系列之前用rndc flush冲洗高速caching。 绑定使用谷歌8.8.8.88.8.4.4作为转发:

在这里输入图像说明

永远不要刷新运行绑定的caching。 绑定使用谷歌8.8.8.88.8.4.4作为转发:

在这里输入图像说明

在第一次请求系列之前用rndc flush冲洗高速caching。 绑定使用更新的根服务器列表作为转发器:

在这里输入图像说明

永远不要刷新运行绑定的caching。 绑定使用更新的根服务器列表作为转发器:

在这里输入图像说明

为什么谷歌公共dns的最大查询时间(大约第一张图上的5k和第三张图的2.5k)比根服务器大?

为什么查询通过绑定比直接查询公共dns服务器慢?

在我的testing中可能是错的?

更新1

图中有20秒TTL – 这是错误的。 TTL为redhat.com是60秒。

您的testing正在测量执行查询的总时间,包括

  • networking延迟到运行testing脚本的机器
  • 在被测名称服务器上处理时间
  • 时间在testing名称服务器花费等待来自其他名称服务器的答案,即。 执行任何recursion子查询的时间

结果非常符合预期。

  • 如果在不刷新caching的情况下查询本地BIND服务器,则大部分时间来自caching。 即使A RR的TTL已经过期,NS RR仍然会在caching中,所以只有A RR本身必须被外部请求。
  • 如果在刷新高速caching并且configuration转发器之后查询本地BIND服务器,则本地BIND服务器将从根服务器开始向下执行recursion查询。
  • 如果在刷新caching后查询本地BIND服务器并将Google服务器configuration为转发器,则本地BIND服务器将按原样将查询转发给其中一个Google服务器,然后该服务器会从其caching中回答查询,或执行recursion查询。 请注意,您无法控制Google服务器的caching。

因此,查询您的本地BIND服务器而不先清除caching是最快的,不受转发器configuration的影响。 清除caching并configuration为转发器的Google服务器后,查询本地BIND服务器比直接查询Google服务器要慢,因为它们会增加后端通过本地BIND服务器的开销。