![实现高 DNS QPS 吞吐量](https://linux22.com/image/776183/%E5%AE%9E%E7%8E%B0%E9%AB%98%20DNS%20QPS%20%E5%90%9E%E5%90%90%E9%87%8F.png)
我正在尝试查找 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
26214400
UDP 缓冲区设置为高于停止缓冲区故障的值::
net.core.rmem_max
net.core.rmem_default
本地端口范围从
32768 61000
到1024 61000
,DNS 可用端口数上限为::
net.ipv4.ip_local_port_range
其他变更:
txqueuelen
来自1000
->20000
ulimits
改为 100000net.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 将响应发送回resolver
但resolver
已将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 次尝试后才发送。
如果你已经读到这里,我必须感谢你阅读这个冗长的问题。我知道这个问题问得太多了,但如果你能给我一些提示,我将不胜感激,因为我无法找到瓶颈所在。
最初发布于超级用户这里