Linux

實現高 DNS QPS 吞吐量

  • April 5, 2022

我試圖找到 DNS Resolver VM 的最大 QPS(每秒查詢數)。

我們的基礎架構託管在 Azure 上,有一個 VM(基於綁定)充當解析器,查詢 Azure 本機 DNS(168.63.129.16)以及本地 DNS。我沒有在解析器上記憶體任何查詢,每個 A 記錄的 TTL 為 300 秒。

我正在使用dnsperf&resperf來觸發載入(僅 A 記錄)。現在,我正在準備 DNS 解析器以抵禦高達 100K QPS 的 DDOS 攻擊。我面臨著解析器和天藍色原生 DNS 解析器之間的查詢速率限制等問題。因此,當 QPS 增加時,解析器會將SERVFAIL響應返回給客戶端。但是,我們沒有看到SERVFAIL解析器和基於本地的 DNS 之間的任何響應。

以 Azure DNS 為目標時,我可以看到的最大 QPS 約為 2100。我在網上搜尋了很多 Azure 是否有任何此類速率限制,但找不到任何相關內容。不知何故,我預感解析器 VM 遇到瓶頸,因為 2K QPS 對於 Azure 基礎架構的規模來說非常低。

一些事情(核心 sysctl 更改),我在最後進行了更改,改進了一點,但並不多。

綁定配置更改 ::

  • recursive-clients1000->30000

UDP 緩衝區的值高於26214400停止緩衝區故障::

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

本地埠範圍從32768 610001024 61000具有可用於 DNS 的最大埠::

  • net.ipv4.ip_local_port_range

雜項變化::

  • txqueuelen1000->20000
  • ulimits更改為 100000
  • net.netfilter.nf_conntrack_max更改為更高的值

除了上述之外,我確實將 VM 大小從 (1 core, 2 GB RAM) -> (4 core, 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 次嘗試後發送。

如果您已經走到了這一步,我必須感謝您閱讀這個冗長的問題。我知道這問得太多了,但是如果您對我有一些提示,我將不勝感激,因為我無法了解瓶頸是什麼。

最初發佈在超級使用者這裡

所以,我會回答我的問題。

實際上,Azure 速率將每秒查詢數限制為1000每個 VM。

它記錄在這裡。無論sysctl我做什麼調整,由於這個速率限制,我們仍然會遇到來自 Azure 的問題。

引用自:https://serverfault.com/questions/1097702