Lograr un alto rendimiento de DNS QPS

Lograr un alto rendimiento de DNS QPS

Estoy tratando de encontrar el QPS (consulta por segundo) máximo de la máquina virtual de resolución de DNS.

Tenemos nuestra infraestructura alojada en Azure, con una máquina virtual (basada en enlaces) que actúa como un solucionador que consulta el DNS nativo de Azure ( 168.63.129.16), así como el DNS local. No estoy almacenando en caché ninguna consulta en el solucionador y cada registro A tiene un TTL de 300 segundos.

Estoy usando dnsperf& resperfpara activar la carga (solo registros A). Ahora que estoy preparando solucionadores de DNS para resistir ataques DDOS de hasta 100K QPS. Me enfrento a problemas como la limitación de la tasa de consultas entre mi solucionador y el solucionador DNS nativo de Azure. Como resultado de esto, cuando aumenta QPS, el solucionador devuelve SERVFAILrespuestas al cliente. Sin embargo, no vimos ninguna SERVFAILrespuesta entre el solucionador y el DNS local.

El QPS máximo que pude ver al apuntar a Azure DNS es de alrededor de 2100. He buscado mucho en línea si Azure realiza alguna limitación de velocidad, pero no pude encontrar nada relacionado. De alguna manera, tengo la corazonada de que la máquina virtual de resolución ha alcanzado un cuello de botella, ya que 2K QPS es muy bajo para la escala de la infraestructura de Azure.

Algunas cosas (cambios en el sistema del kernel) las cambié al final, lo que mejoró un poco, pero no mucho.

Vincular cambios de configuración ::

  • recursive-clientsdesde 1000->30000

Búfer UDP a un valor mayor que 26214400para detener fallas del búfer::

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

El rango de puertos locales va desde 32768 61000hasta 1024 61000tener el máximo de puertos disponibles para DNS::

  • net.ipv4.ip_local_port_range

cambios varios::

  • txqueuelendesde 1000->20000

  • ulimitscambiado a 100000

  • net.netfilter.nf_conntrack_maxcambiado a un valor mucho más alto

Además de lo anterior, aumenté el tamaño de la VM de (1 núcleo, 2 GB de RAM) -> (4 núcleos, 8 GB de RAM). Después de aumentar, los errores de paquetes desaparecieron (marcado netstat -s) pero no mejoraron SERVFAILlos errores.

Habilité tcpdumpla verificación del patrón de SERVFAILerrores. En caso de fallas, el solucionador intenta enviar la consulta a Azure DNS 5 veces (cada una después de 1 segundo), pero no escuchó nada de Azure DNS y, por lo tanto, envía la SERVFAILrespuesta al cliente. Después de cargar el pcaparchivo en Wireshark, veo que Azure DNS devuelve la respuesta resolverpero resolverya la había enviado SERVFAILal cliente.

¿Por qué se cierra la conexión antes de tener la respuesta? La corriente net.netfilter.nf_conntrack_udp_timeoutse deja intacta durante 30segundos, pero resolverse envía SERVFAILdespués de 5 segundos al cliente.

A continuación se muestran tcpdumpregistros 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 puede ver en la parte inferior, la línea ServFailse envía después de 5 intentos.

Si ha llegado hasta aquí, debo agradecerle por leer esta extensa pregunta. Sé que esto es pedir demasiado, pero le agradezco que tenga algunas pistas para mí, ya que no puedo entender cuál es el cuello de botella.

Publicado originalmente en superusuarioaquí

Respuesta1

Entonces, responderé mi pregunta.

De hecho, la tasa de Azure limita las consultas por segundo a 1000por máquina virtual.

esta documentadoaquí. No importa el sysctlajuste que haga, todavía tenemos problemas con Azure debido a esta limitación de velocidad.

información relacionada