Достижение высокой пропускной способности DNS QPS

Достижение высокой пропускной способности DNS QPS

Я пытаюсь найти максимальное значение QPS (количество запросов в секунду) виртуальной машины DNS Resolver.

Наша инфраструктура размещена на Azure, имея виртуальную машину (основанную на привязке), действующую как распознаватель, запрашивающий собственный DNS Azure ( 168.63.129.16), а также локальный DNS. Я не кэширую запросы на распознавателе, и каждая A-запись имеет TTL в 300 секунд.

Я использую dnsperf& resperfдля запуска нагрузки (только A-записи). Теперь, когда я готовлю DNS-резолверы к противостоянию DDOS-атакам до 100 тыс. запросов в секунду, я сталкиваюсь с такими проблемами, как ограничение скорости запросов между моим резольвером и собственным DNS-резолвером Azure. В результате этого, когда QPS увеличивается, резольвер возвращает SERVFAILответы обратно клиенту. Однако мы не увидели никаких SERVFAILответов между резольвером и DNS на локальной основе.

Максимальное значение QPS, которое я мог видеть при нацеливании на Azure DNS, составляет около 2100. Я много искал в Интернете, есть ли такое ограничение скорости, сделанное Azure, но не смог найти ничего связанного. Каким-то образом я подозреваю, что узкое место — это виртуальная машина резолвера, так как 2K QPS — это очень мало для масштаба инфраструктуры Azure.

Я изменил несколько вещей (изменения ядра sysctl), что немного улучшило ситуацию, но не намного.

Изменения конфигурации привязки ::

  • recursive-clientsиз 1000->30000

UDP-буферы устанавливаются на более высокое значение, чем 26214400для предотвращения сбоев буфера:

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

Диапазон локальных портов от 32768 61000до, 1024 61000чтобы иметь максимальное количество портов, доступных для DNS::

  • net.ipv4.ip_local_port_range

разные изменения::

  • txqueuelenиз 1000->20000

  • ulimitsизменено на 100000

  • net.netfilter.nf_conntrack_maxизменено на гораздо более высокое значение

В дополнение к вышесказанному, я увеличил размер VM с (1 ядро, 2 ГБ ОЗУ) -> (4 ядра, 8 ГБ ОЗУ). После увеличения ошибки пакетов исчезли (проверено ), но ошибки 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секунд, но resolverотправляется SERVFAILчерез 5 секунд клиенту.

Ниже приведены 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 попыток.

Если вы зашли так далеко, я должен поблагодарить вас за прочтение этого длинного вопроса. Я знаю, что это слишком большая просьба, но я буду признателен, если у вас есть какие-то подсказки для меня, так как я не могу понять, в чем загвоздка.

Первоначально опубликовано на superuserздесь

решение1

Итак, я отвечу на свой вопрос.

Действительно, Azure ограничивает скорость запросов в секунду на 1000одну виртуальную машину.

Это задокументировано.здесь. Какие бы sysctlнастройки я ни делал, у нас все равно возникают проблемы с Azure из-за этого ограничения скорости.

Связанный контент