这也可能是关于 BIND9 DNS 服务器的问题。我发现有时候服务器每秒的查询数突然变成了0,然后就这样持续了几秒,一般都是10多秒。但是,传入的 DNS 查询请求的数量永远不会低于每秒 500 个。
我向 BIND9 src 添加了一些调试日志,然后再次运行,然后我注意到线程会在 recvmsg() 定期返回之前等待几秒钟。当它挂起时,Recv-Q 变满了。版本是BIND-9.9.6,但不幸的是当我切换到BIND-9.9.9-P4时,问题仍然存在。
然后我尝试了另一个用 Golang 编写的 DNS 服务器,我注意到问题从未出现。查询率保持稳定。
我认为服务器使用的 Golang 的 ReadFromUDP() 函数只是包装了系统调用 recvfrom(),并且那里的 recvfrom() 也不会阻塞。但是 ReadFromUDP() 似乎一直在尝试 recvfrom(),而 BIND9 正在使用 epoll。当数据成功读取后,ReadFromUDP() 将返回。我不确定这两种情况之间是否真的有任何区别。
我使用的是 CentOs 6.4,内核版本是 2.6.32-358-el6.x86_64。
有没有人遇到过这样的问题?