高いDNS QPSスループットの実現

高いDNS QPSスループットの実現

DNS リゾルバ VM の最大 QPS (1 秒あたりのクエリ数) を見つけようとしています。

私たちのインフラストラクチャは Azure でホストされており、Azure ネイティブ DNS ( ) とオンプレミス DNS を照会するリゾルバとして機能する VM (バインド ベース) があります168.63.129.16。リゾルバでクエリをキャッシュしておらず、各 A レコードの TTL は 300 秒です。

dnsperf&を使用してresperf負荷をトリガーしています (A レコードのみ)。現在、最大 100K QPS の DDOS 攻撃に耐えられるように DNS リゾルバーを準備しています。リゾルバーと Azure ネイティブ DNS リゾルバー間のクエリ レート制限などの問題に直面しています。この結果、QPS が増加すると、リゾルバーはクライアントに応答を返します。ただし、リゾルバーとオンプレミス ベースの DNS 間では応答がSERVFAIL見られませんでした。SERVFAIL

Azure DNS をターゲットにしているときに確認できた最大 QPS は約 2100 です。Azure によってこのようなレート制限が行われているかどうかをオンラインでたくさん検索しましたが、関連するものは見つかりませんでした。2K QPS は Azure インフラストラクチャの規模に対して非常に低いため、リゾルバ VM がボトルネックになっているのではないかと思います。

いくつかの変更 (カーネル sysctl の変更) を自分の側で行いましたが、少しは改善されましたが、それほど大きな改善はありませんでした。

バインド構成の変更::

  • recursive-clientsから1000->30000

26214400バッファ障害を停止するには、UDP バッファをより高い値に設定します。

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

ローカル ポート範囲は から で32768 610001024 61000DNS に使用できる最大ポート数は です::

  • net.ipv4.ip_local_port_range

その他の変更::

  • txqueuelenから1000->20000

  • ulimits100000に変更

  • net.netfilter.nf_conntrack_maxはるかに高い値に変更されました

上記に加えて、VM サイズを (1 コア、2 GB RAM) -> (4 コア、8 GB RAM) に増やしました。増やした後、パケット エラーは消えましたが (確認済みnetstat -s)、エラーは改善されませんでしたSERVFAIL

tcpdumpエラーのパターンをチェックできるようにしましたSERVFAIL。失敗した場合、リゾルバーは Azure DNS にクエリを 5 回 (1 秒ごとに) 送信しようとしますが、Azure DNS から何も受信していないため、応答をSERVFAILクライアントに返します。pcapファイルを にロードすると、Azure DNS は に応答を返しますが、すでにクライアントに応答を送信していることWiresharkがわかります。resolverresolverSERVFAIL

応答を得る前に接続が閉じられるのはなぜですか? 現在は数秒間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)

下の行からわかるように、ServFail5 回の試行後に送信されます。

ここまで読んでくださった方は、この長い質問を読んでくださったことに感謝いたします。これはあまりにも無理なお願いだとは思いますが、ボトルネックが何なのか私にはわからないので、何かヒントがあれば教えていただけるとありがたいです。

元々はsuperuserに投稿されましたここ

答え1

それで、私の質問に答えます。

実際、Azure では 1 秒あたりのクエリ数が1000VM ごとにレート制限されています。

文書化されているここどのようなsysctlチューニングを行っても、このレート制限のために Azure で問題が発生します。

関連情報