实现高 DNS QPS 吞吐量

实现高 DNS QPS 吞吐量

我正在尝试查找 DNS 解析器 VM 的最大 QPS(每秒查询数)。

我们的基础设施托管在 Azure 上,有一个 VM(基于绑定)充当解析器,查询 Azure 本机 DNS(168.63.129.16)以及本地 DNS。我没有在解析器上缓存任何查询,并且每个 A 记录的 TTL 为 300 秒。

我正在使用dnsperf&resperf来触发负载(仅限 A 记录)。现在,我正在准备 DNS 解析器以抵御高达 100K QPS 的 DDOS 攻击。我面临着诸如我的解析器和 Azure 本机 DNS 解析器之间的查询速率限制之类的问题。因此,当 QPS 增加时,解析器会将SERVFAIL响应返回给客户端。但是,我们没有看到SERVFAIL解析器和基于本地的 DNS 之间的任何响应。

我可以看到,针对 Azure DNS 的最大 QPS 约为 2100。我在网上搜索了很多次,看 Azure 是否进行了此类速率限制,但找不到任何相关内容。不知何故,我预感到解析器 VM 遇到了瓶颈,因为对于 Azure 基础设施的规模来说,2K QPS 非常低。

我修改了一些内容(内核 sysctl 更改),虽然有所改进,但效果并不大。

绑定配置更改::

  • recursive-clients来自1000->30000

26214400UDP 缓冲区设置为高于停止缓冲区故障的值::

  • net.core.rmem_max
  • net.core.rmem_default

本地端口范围从32768 610001024 61000,DNS 可用端口数上限为::

  • net.ipv4.ip_local_port_range

其他变更:

  • txqueuelen来自1000->20000

  • ulimits改为 100000

  • net.netfilter.nf_conntrack_max变为更高的值

除上述操作外,我还将虚拟机大小从(1 核,2 GB RAM)增加到(4 核,8 GB RAM)。增加后,数据包错误消失了(已检查),但错误netstat -s没有改善。SERVFAIL

我确实启用了tcpdump检查错误模式的功能SERVFAIL。如果发生故障,解析器会尝试将查询发送到 Azure DNS 5 次(每次间隔 1 秒),但它没有收到来自 Azure DNS 的任何消息,因此将响应发送SERVFAIL回客户端。将文件加载pcap到后Wireshark,我看到 Azure DNS 将响应发送回resolverresolver已将SERVFAIL响应发送到客户端。

为什么在收到响应之前就关闭了连接?当前时间net.netfilter.nf_conntrack_udp_timeout保持不变,30但会在 5 秒后resolver发送给客户端。SERVFAIL

以下是::tcpdump期间的日志ServFail

reading from file dns4.pcap, link-type EN10MB (Ethernet)
10.0.0.10.57710 > 10.0.0.11.domain: [udp sum ok] 1612+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.44513 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x8cfd!] 52637+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=4096 DO (77)
10.0.0.11.32378 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x3950!] 20672+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.59973 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0xe2e5!] 15199+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.29976 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0x051b!] 47104+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.43442 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0xe791!] 41199+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.domain > 10.0.0.10.57710: [bad udp cksum 0x2a89 -> 0x5e30!] 1612 ServFail q: A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. 0/0/0 (66)

从底线可以看出,ServFail经过 5 次尝试后才发送。

如果你已经读到这里,我必须感谢你阅读这个冗长的问题。我知道这个问题问得太多了,但如果你能给我一些提示,我将不胜感激,因为我无法找到瓶颈所在。

最初发布于超级用户这里

答案1

因此,我将回答我的问题。

实际上,Azure 速率限制了每个虚拟机每秒的查询次数1000

有记录这里。无论sysctl我做什么调整,由于这种速率限制,我们仍然会遇到 Azure 问题。

相关内容