
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
& resperf
para 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 SERVFAIL
respuestas al cliente. Sin embargo, no vimos ninguna SERVFAIL
respuesta 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-clients
desde1000
->30000
Búfer UDP a un valor mayor que
26214400
para detener fallas del búfer::
net.core.rmem_max
net.core.rmem_default
El rango de puertos locales va desde
32768 61000
hasta1024 61000
tener el máximo de puertos disponibles para DNS::
net.ipv4.ip_local_port_range
cambios varios::
txqueuelen
desde1000
->20000
ulimits
cambiado a 100000net.netfilter.nf_conntrack_max
cambiado 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 SERVFAIL
los errores.
Habilité tcpdump
la verificación del patrón de SERVFAIL
errores. 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 SERVFAIL
respuesta al cliente. Después de cargar el pcap
archivo en Wireshark
, veo que Azure DNS devuelve la respuesta resolver
pero resolver
ya la había enviado SERVFAIL
al cliente.
¿Por qué se cierra la conexión antes de tener la respuesta? La corriente net.netfilter.nf_conntrack_udp_timeout
se deja intacta durante 30
segundos, pero resolver
se envía SERVFAIL
después de 5 segundos al cliente.
A continuación se muestran tcpdump
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 puede ver en la parte inferior, la línea ServFail
se 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 1000
por máquina virtual.
esta documentadoaquí. No importa el sysctl
ajuste que haga, todavía tenemos problemas con Azure debido a esta limitación de velocidad.