Estoy investigando si puedo implementar una aplicación HPC en Windows que reciba pequeños datagramas UDP de multidifusión (en su mayoría de 100 a 400 bytes) a una velocidad alta, usando una docena o hasta quizás 200 grupos de multidifusión (es decir, usando MSI-X y RSS, puedo escala a múltiples núcleos), realiza un procesamiento por paquete y luego lo envía. Al enviar a través de TCP, logré subir todo lo que necesitaba (6,4 Gb / s) sin golpear una pared, pero recibir datagramas a altas velocidades de pps resultó ser un problema.
En una prueba reciente en una máquina NUMA de alta especificación con una NIC Ethernet de 10 Gb de 2 puertos en Windows 2012 R2, solo pude recibir cientos de miles de datagramas UDP por segundo (caída temprana, es decir, sin procesar realmente los datos, para eliminar la sobrecarga de procesamiento de mi aplicación de la ecuación para ver qué tan rápido se vuelve) usando 2x12 núcleos, y la parte del kernel de los 12 grupos de multidifusión probados parecía distribuirse en 8 o 10 núcleos de un nodo NUMA ( se configuraron las colas RSS máximas) a 16), aunque con una aplicación .net, por lo que las aplicaciones nativas deberían poder ir más rápido.
Pero incluso Len Holgate solo logró recibir paquetes UDP a 500kpps en sus pruebas RIO de Windows de alto rendimiento , utilizando una carga útil UDP de 1024 bytes.
En el documento técnico de QLogic (no se menciona el SO bajo prueba), los límites para el "enrutamiento de paquetes superpequeños de subprocesos múltiples" (de modo que incluye tanto la recepción como el envío posterior?) Se establecen en 5.7Mpps . En los artículos sobre redes Linux , los límites se establecen en 1Mpps a 2Mpps por núcleo (según informes, aumentando más o menos linealmente), o incluso 15Mpps con soluciones especiales que omiten el núcleo.
Por ejemplo, netmap
puede generar tráfico a velocidad de línea ( 14.88Mpps ) en un enlace 10GigE con un solo núcleo funcionando a 900Mhz. Esto equivale a aproximadamente 60-65 ciclos de reloj por paquete, y se escala bien con núcleos y frecuencia de reloj (con 4 núcleos, la velocidad de línea se logra a menos de 450 MHz). Se alcanzan tasas similares en el lado de recepción .
Entonces, ¿hasta dónde puedo llegar (las últimas versiones de) Windows / Windows Server, en particular, recibir la multidifusión UDP como se describe en el párrafo anterior?
Editar Hay una publicación en el blog de Cloudflare, y una interesante sección de comentarios, sobre cómo hacerlo en Linux: cómo recibir un millón de paquetes por segundo , y está la página de comentarios de noticias de piratas informáticos correspondiente .