實現高 DNS QPS 吞吐量

實現高 DNS QPS 吞吐量

我試圖找到 DNS 解析器虛擬機器的最大 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。不知何故,我預感解析器 VM 遇到了瓶頸,因為對於 Azure 基礎架構的規模而言,2K QPS 非常低。

我最後改變了一些事情(核心 sysctl 更改),改進了一點,但改進不大。

綁定配置變更::

  • recursive-clients1000->30000

26214400UDP 緩衝到比停止緩衝故障更高的值::

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

本機連接埠範圍從32768 61000到 到1024 61000可用於 DNS 的最大連接埠數::

  • net.ipv4.ip_local_port_range

雜項變更::

  • txqueuelen1000->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回應傳送到客戶端。

為什麼連線在收到回應之前就關閉了? Current在數秒net.netfilter.nf_conntrack_udp_timeout內保持不變,但在 5 秒後發送到用戶端。30resolverSERVFAIL

以下是::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 的問題。

相關內容