BIND – 缓慢查询响应隔离到单一接口

目前在我的域名服务器上的特定接口上遇到缓慢的查询响应。 我正在一个网卡的物理服务器上运行BIND。 这个网卡被eth0接口和eth0:1虚拟接口所利用。 他们都在同一个子网中有一个地址。

BIND正在监听所有IPv4接口,并且有一些非常基本的选项。 在其他包含的configuration文件中没有设置其他性能/networking相关的选项。

listen-on { any;}; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/log/named/named.stats"; memstatistics-file "/var/named/data/named_mem_stats.txt"; 

当我查询主接口eth0上的地址时,通常会得到大约三秒钟或更长时间的延迟响应。 这甚至适用于从盒子本身查询地址(而不是回送)的情况。 当查询分配给虚拟接口eth0:1的其他私有IP地址时,不会遇到性能问题,并且响应总是在一秒钟之内。

分析性能统计,看起来这个盒子没有负载,内存没有被刷新。 我也有另一个名称服务器作为这个从属的设置,在同一networking上几乎相同的networking设置栏寻址,并没有性能问题查询它的主界面(它也有一个虚拟接口具有相同的configuration) 。 我查询的区域是权威性的,所以在其他地方查询logging是不会有任何延误的。 我也能够确认服务器几乎立即收到查询,而不pipe它是从哪里发出的,并且在收到的查询和正在发送的响应(通过tcpdump标识)之间发生延迟。

如果有任何有用的信息,请不要低估我在文章中遗漏的信息,请在下面留言,我很乐意提供任何有用的信息。 任何关于如何最好地解决这种性质的问题的build议,或者关于潜在原因的想法都可能是非常值得赞赏的。

BIND版本是9.3.6-P1-RedHat-9.3.6-25.P1.el5_11.11。 我最近更新了这个,但是我不能确定这些性能问题是在升级之后产生的,还是在它之前存在。

编辑:挖掘输出按要求。 删除了被查询的域名和目标服务器。

另外值得注意的是,有时这些请求只是完全超时。 这是非常间歇性的,偶尔在两秒钟内回复,但大多超过三个偶尔超时提到。

 [root@hugh-host-01 ~]# dig REMOVED @REMOVED ; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3 <<>> REMOVED @REMOVED ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52129 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 4 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;REMOVED. IN A ;; ANSWER SECTION: REMOVED. 5 IN A REMOVED ;; AUTHORITY SECTION: REMOVED. 5 IN NS REMOVED. REMOVED. 5 IN NS REMOVED. REMOVED. 5 IN NS REMOVED. ;; ADDITIONAL SECTION: REMOVED. 5 IN A REMOVED REMOVED. 5 IN A REMOVED REMOVED. 5 IN A REMOVED ;; Query time: 3633 msec ;; SERVER: REMOVED#53(REMOVED) ;; WHEN: Sat Jan 07 00:49:01 GMT 2017 ;; MSG SIZE rcvd: 155 

谢谢你的时间,

这个问题是由服务器上的iowait最大化造成的。 它一直运行在100%,因为引起它的服务。

感谢Andrew B的build议,我开始使用netstat -su |查看UDP数据包错误 grep错误。 由此我可以看出它每秒钟大概30-50个数据包。 这导致我通过运行netstat -uanp检查每个套接字UDP的缓冲区。 由此,我能够确认随机延迟和偶尔超时(下降)是由于缓冲区已满而发生的。 通过分析正在讨论的IP /端口上的BIND服务的Recv-Q列中的值,我发现缓冲区已满。

确定缓冲区已满后,没有太多的意义增加它,因为它无疑会再次饱和。 相反,由于CPU负载和内存看起来不错,我开始怀疑磁盘操作是否会造成处理UDP数据包的瓶颈。 这是通过运行commmand顶部并分析iowait值来确认的。

一旦我确定CPU正在等待几乎100%的时间完成io操作,我开始使用诸如iotop之类的工具来查找正在写入磁盘的内容。 原来ext3文件系统的日志系统正在产生所有的等待。 这使我想到,也许是服务器上的大量日志logging可能导致饱和,因为我知道/ var / log / messages文件每秒都会收到大量的拒绝查询日志。

testing上面的理论,我在logging区域里添加了如下一行到named.conf。 此行禁止logging审批/拒绝与收到的查询相关的消息。 每个查询都有一个日志放在/ var / log / messages中,如果你被客户拦截,这可能会很多。

 category security { null; }; 

幸运的是,在重新启动BIND之后,我可以看到iowait百分比急剧下降。 testing查询,我能够确认,他们正在十分之一秒内得到回答, 以前有戏剧性的改善。

事后看来,我应该先检查艾奥瓦时间。 希望这有助于任何遇到类似问题的人。 我现在正在考虑更多地控制日志logging,并且看看我能对这些被拒绝的消息做些什么。