我们刚刚使用最新的稳定版绑定9.10设置了一个recursion的DNS服务器
我们发现recursion的DNS查询很慢。 任何地方从1 – 3秒。 一旦查找caching,DNS就像预期的那样在几毫秒内解决。
我们正在利用ROOT提示进行recursion查找,这似乎是缓慢来自的地方。 如果我们configuration一个转发器,DNS分辨率就会下降到100 – 300ms的合理的recursion时间。
对于我们正在build立的服务,我不想依赖转发器,我宁愿使用根提示。
这里是我们的named.conf文件的主要configuration。 任何帮助提高性能的指针都会很棒。
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";
我们发现了这个问题。 这是一个NIC硬件卸载问题。
运行tcpdump -vvv -s 0 -l -n port 53为每个DNS查询find了一些[bad udp cksum 6279!]错误。
Google上的一些浏览指出了我的正确方向。 事实certificate,由于我们的CentOS系统在XenServer上作为虚拟机运行(VMWare等报告了类似的问题),默认情况下启用NIC硬件卸载。
运行ethtool -k eth0 | grep on 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卸载。 我重新启动了networking服务
service network restart
并testing了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
我在物理CentOS 7 BIND服务器上遇到了非常缓慢的recursion查询的问题,并发现这个答案(TX卸载)以及围绕各种线程的许多面向IPv6的修复,这些修复都不适用于我。
事实certificate,有问题的服务器的位置有一个较旧的思科ASA防火墙,它将UDP响应数据包的大小限制为512字节; 现在看来,DNS查询的UDP响应通常要大得多,高达2000字节左右。 这里有一个关于它的网页:
为什么DNS通过UDP有一个512字节的限制?
我configuration了ASA以允许更大的UDP响应数据包(这里有一个特定的修复命令)解决了这个问题: