![绑定 DNS 递归缓慢](https://linux22.com/image/666866/%E7%BB%91%E5%AE%9A%20DNS%20%E9%80%92%E5%BD%92%E7%BC%93%E6%85%A2.png)
我们刚刚使用 Bind 9.10 的最新稳定版本设置了一个递归 DNS 服务器
我们发现递归 DNS 查找非常慢。大约需要 1 到 3 秒。一旦查找进入缓存,DNS 就会按预期在几毫秒内解析。
我们正在利用 ROOT 提示进行递归查找,这似乎是导致速度缓慢的原因。如果我们配置转发器,DNS 解析将缩短至合理的 100 - 300ms 递归时间。
对于我们正在设置的服务,我不想依赖转发器,我更愿意使用根提示。
以下是我们的主要配置命名配置文件文件。任何有助于提高性能的指示都很好。
options{
allow-recursion { any; };
allow-query-cache { any; };
allow-query { any; };
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
zone-statistics yes;
max-cache-ttl 3600;
max-ncache-ttl 3600;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/stats/named_stats.txt";
memstatistics-file "/var/named/stats/named_mem_stats.txt";
rate-limit {
responses-per-second 10;
log-only yes;
};
prefetch 5;};
zone "." {
type hint;
file "named.ca";};
include "/var/named/conf/logging.conf";
答案1
我们找到了问题所在。这是 NIC 硬件卸载问题。
运行后发现每个 DNS 查询都存在tcpdump -vvv -s 0 -l -n port 53
一些错误。[bad udp cksum 6279!]
在 Google 上稍微浏览了一下,我找到了正确的方向。事实证明,由于我们的 CentOS 系统在 XenServer 上作为 VM 运行(VMWare 等也报告了类似的问题),NIC 硬件卸载默认启用。
运行ethtool -k eth0 | grep on
结果如下
x-checksumming: on
tx-checksum-ipv4: on
scatter-gather: on
tx-scatter-gather: on
tcp-segmentation-offload: off
tx-tcp-segmentation: off
tx-tcp-ecn-segmentation: off
tx-tcp6-segmentation: off
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on
tx-gso-robust: on [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
运行ethtool -K eth0 tx off rx off
已禁用的 TCP TX 卸载。我重新启动了网络服务,以确保万无一失
service network restart
并测试了 BIND。我们现在从 BIND 获得了非常快速的响应时间
dig centos.org
; <<>> DiG 9.10.2-P4-RedHat-9.10.2-P4.el6 <<>> centos.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61933
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;centos.org.INA
;; ANSWER SECTION:
centos.org.60INA85.12.30.227
;; Query time: 268 msec
;; SERVER: 192.168.10.25#53(192.168.10.25)
;; WHEN: Thu Sep 17 08:25:39 AEST 2015
;; MSG SIZE rcvd: 55
答案2
我在物理 CentOS 7 BIND 服务器上遇到了同样的问题,递归查询非常慢,并找到了这个答案(TX Offloading)和许多围绕各种线程的面向 IPv6 的修复程序,但对我都不起作用。
事实证明,有问题的服务器所在位置有一个较旧的 Cisco ASA 防火墙,它将 UDP 响应数据包的大小限制为 512 字节;现在 DNS 查询的 UDP 响应似乎通常要大得多,最多可达 2000 字节左右。这里有一个关于它的页面:
我将 ASA 配置为允许更大的 UDP 响应数据包(有一个特定的修复命令),从而解决了该问题: