我们在 ubuntu 12.04 中绑定了 9.8.1.dfsg.P1-4ubuntu0.13,它在负载不重的服务器上运行(平均负载:0.19、0.12、0.13)并为具有 macos 和 ubuntu 工作站的小型办公网络提供请求。
我在作为 DNS 服务器运行的容器上的脚本中运行了一些 DNS 测试,并将结果推送到 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
我发现 bind 响应请求的速度比8.8.8.8和77.88.8.8。这可以从图表中看出:
在第一个请求系列之前刷新缓存rndc flush
。Bind 使用 google8.8.8.8和8.8.4.4作为货运代理:
切勿刷新正在运行的 bind 的缓存。Bind 使用 google8.8.8.8和8.8.4.4作为货运代理:
在第一个请求系列之前刷新缓存rndc flush
。Bind 使用更新的根服务器列表作为转发器:
切勿刷新正在运行的 bind 的缓存。Bind 使用更新的根服务器列表作为转发器:
为什么使用 google 公共 dns 的最大查询时间(第一个图上约为 5k,第三个图上约为 2.5k)比根服务器要大?
为什么通过 bind 查询比直接查询公共 DNS 服务器慢?
我的测试可能出了问题吗?
更新 1
图表上显示的 TTL 为 20 秒 - 这是错误的。redhat.com 的 TTL 为 60 秒。
答案1
您的测试正在测量执行查询的总时间,包括
- 运行测试脚本的机器的网络延迟
- 测试名称服务器的处理时间
- 被测名称服务器等待其他名称服务器答复的时间,即执行任何递归子查询的时间
结果和预期的差不多。
- 如果您查询本地 BIND 服务器而不刷新缓存,则大多数情况下答案都会来自缓存。即使 A RR 的 TTL 已过期,NS RR 仍会保留在缓存中,因此只需从外部请求 A RR 本身即可。
- 如果你在刷新缓存后查询本地 BIND 服务器,并且不是配置转发器后,您的本地 BIND 服务器将从根服务器开始向下执行递归查询。
- 如果您在刷新缓存后查询本地 BIND 服务器,并将 Google 服务器配置为转发器,则本地 BIND 服务器会将查询原样转发到其中一个 Google 服务器,然后该服务器会依次从其缓存中回答查询或执行递归查询。请注意,您无法控制 Google 服务器的缓存。
因此,在未先清除缓存的情况下对本地 BIND 服务器的查询速度最快,并且不受转发器配置的影响。在清除缓存后将 Google 服务器配置为转发器的情况下对本地 BIND 服务器的查询速度比直接对 Google 服务器的查询速度慢,因为它们增加了后者先通过本地 BIND 服务器的开销。