
Я пытаюсь найти максимальное значение 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
изменено на 100000net.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 из-за этого ограничения скорости.