Alcançando alto rendimento de QPS de DNS

Alcançando alto rendimento de QPS de DNS

Estou tentando encontrar o QPS (consulta por segundo) máximo da VM do DNS Resolver.

Temos nossa infraestrutura hospedada no Azure, tendo uma VM (baseada em bind) atuando como um resolvedor consultando o DNS nativo do Azure ( 168.63.129.16), bem como o DNS local. Não estou armazenando em cache nenhuma consulta no resolvedor e cada registro A tem um TTL de 300 segundos.

Estou usando dnsperf& resperfpara acionar a carga (apenas registros A). Agora estou preparando resolvedores de DNS para resistir a ataques DDOS de até 100 mil QPS. Estou enfrentando problemas como limitação de taxa de consulta entre meu resolvedor e o resolvedor DNS nativo do Azure. Como resultado disso, quando o QPS é aumentado, o resolvedor retorna SERVFAILrespostas ao cliente. No entanto, não vimos nenhuma SERVFAILresposta entre o resolvedor e o DNS baseado no local.

O QPS máximo que pude ver ao direcionar o DNS do Azure é por volta de 2100. Pesquisei muito on-line se existe alguma limitação de taxa feita pelo Azure, mas não consegui encontrar nada relacionado. De alguma forma, presumo que a VM do resolvedor atingiu um gargalo, pois 2K QPS é muito baixo para a escala da infraestrutura do Azure.

Algumas coisas (mudanças no sysctl do kernel), eu mudei no final, o que melhorou um pouco, mas não muito.

Alterações de configuração de vinculação ::

  • recursive-clientsde 1000->30000

Buffers UDP para um valor mais alto do que 26214400para interromper falhas de buffer::

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

Faixa de portas locais de 32768 61000a 1024 61000para ter o máximo de portas disponíveis para DNS::

  • net.ipv4.ip_local_port_range

alterações diversas::

  • txqueuelende 1000->20000

  • ulimitsalterado para 100.000

  • net.netfilter.nf_conntrack_maxmudou para um valor muito mais alto

Além do acima, aumentei o tamanho da VM de (1 núcleo, 2 GB de RAM) -> (4 núcleos, 8 GB de RAM). Após aumentar, os erros de pacotes desapareceram (marcados netstat -s), mas não melhoraram SERVFAILos erros.

Eu habilitei tcpdumppara verificar o padrão de SERVFAILerros. Em caso de falhas, o resolvedor tenta enviar a consulta ao DNS do Azure 5 vezes (cada uma após 1 segundo), mas não ouviu nada do DNS do Azure e, portanto, enviou a SERVFAILresposta de volta ao cliente. Depois de carregar o pcaparquivo Wireshark, vejo que o DNS do Azure envia a resposta de volta, resolvermas resolverjá enviou a SERVFAILresposta ao cliente.

Por que a conexão é fechada antes de receber a resposta? A corrente net.netfilter.nf_conntrack_udp_timeoutpermanece inalterada por 30segundos, mas resolveré enviada SERVFAILapós 5 segundos para o cliente.

Abaixo estão tcpdumpos registros durante 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)

Como você pode ver no resultado final, ServFailé enviado após 5 tentativas.

Se você chegou até aqui, devo agradecer por ler esta longa pergunta. Eu sei que isso é pedir demais, mas agradeço se você tiver algumas dicas para mim, pois não consigo entender qual é o gargalo.

Postado originalmente em superusuárioaqui

Responder1

Então, responderei minha pergunta.

Na verdade, a taxa do Azure limita as consultas por segundo a 1000por VM.

Está documentadoaqui. Não importa o sysctlajuste que eu faça, ainda temos problemas com o Azure devido a essa limitação de taxa.

informação relacionada