Saltar al contenido

ASP.NET Core: saturación de 10 GbE a más de 7 millones de solicitudes / s | Edad de ascenso

Más de 7 millones de solicitudes HTTP por segundo desde un solo servidor

Han pasado 2 años desde la última vez que publiqué sobre el rendimiento de ASP.NET Core;
durante su vista previa, pre versión 1.0. Como vista previa 2 de tiene ASP.NET Core 3.0
acaba de ser lanzado; es hora de hacer un seguimiento y descubrir cómo ha evolucionado.

ASP.NET Core 2.2 (actual)

Mirando la última ejecución de los resultados continuos de TechEmpower Benchmarks
ASP.NET 2.2 es el tercer servidor web más rápido (0.046% de descuento en el primer lugar); capaz de responder a 7 millones de solicitudes HTTP por segundo:

Recientemente vi otra publicación; sobre un producto diferente, cuyo rendimiento se midió mensualmente;
así que si usamos ese período de tiempo, eso es 18,1 billones de solicitudes HTTP por mes.

También es una cantidad extraordinaria de ancho de banda; suficiente para saturar continuamente un enlace de 10GBps.
Estos resultados son con el servidor web y el probador de carga ejecutándose dentro de los contenedores de Docker,
en dos máquinas Linux físicas diferentes *; conectado con una red de 10 GbE.

¡Todo este rendimiento desde un solo servidor! ASP.NET Core es rápido en Linux (y en Windows).

¿Cómo se compara con otros servidores conocidos?

En estas comparaciones de “plataformas”, eso es:

Servidor orientado a Internet

Servidor web Kestrel de ASP.NET Core;
que se utiliza en estos puntos de referencia,
es un servidor perimetral, por lo que se puede utilizar como
servidor web orientado a Internet, como se explica en la documentación:

No necesita un segundo servidor web que actúe como servidor proxy inverso al frente y puede funcionar a toda velocidad.
También funciona con proxies inversos si se ajusta más a su infraestructura.

Rendimiento de acceso a datos

A menudo escucho el argumento derrotista de que un rendimiento como este no importa porque “mi base de datos es lenta”; bueno, los tiempos están cambiando …

Tipo de prueba 5: actualizaciones de la base de datos

Ejercita la persistencia de objetos del ORM y el rendimiento del controlador de la base de datos en ejecución UPDATE declaraciones o similar.
El espíritu de esta prueba es ejercitar un número variable de operaciones de base de datos de estilo de lectura y escritura.

Solicitud de API HTTP => 20 consultas de base de datos => 20 actualizaciones de base de datos

ASP.NET Core ocupa la octava, novena y décima posición de 331 entradas,
para raw, middleware y mvc (que son “plataforma”, “micro-framework” y “full-framework” respectivamente)

El nivel de “plataforma” ejecuta 550,120 sentencias SQL por segundo (13,753 * (20 SELECT + 20 UPDATE))

Mirando eso durante períodos de tiempo más largos, eso es:

Tipo de prueba 4: Fortunas

Esta es la prueba más completa, imitando más de cerca una gama más amplia de actividades que una aplicación web ejecuta en combinación para producir una página web:

Ejercita el ORM, la conectividad de la base de datos, las colecciones de tamaño dinámico, la clasificación, las plantillas del lado del servidor, las contramedidas XSS y la codificación de caracteres.

ASP.NET Core funciona bien aquí también con 298,477 solicitudes atendidas por segundo; llegando séptimo de 350 entradas.

.NET se ejecuta en Common Language Runtime, que es un lenguaje neutro, por lo que tampoco se trata solo de C #; con VB.NET en el puesto 14.

.NET puede trabajar con muchas bases de datos diferentes; así que mirando MySQL

Tipo de prueba 3: consultas de múltiples bases de datos

Se obtienen varias filas para castigar de manera más drástica al controlador de la base de datos y al grupo de conexiones.
En las consultas por solicitud más altas probadas (20), esta prueba demuestra la convergencia de todos los marcos
hacia cero solicitudes por segundo a medida que aumenta la actividad de la base de datos.

ASP.NET ocupa el sexto lugar de 178 entradas de MySql; realizar 419,460 consultas por segundo (20,973 * 20)

¿Por qué es importante el rendimiento?

En Illyriad Games estamos creando una nueva escala de juegos para Age of Ascent,
un Ultra-MMO con combate de contracción en tiempo real a una escala sin precedentes.
El alto rendimiento a nivel empresarial significa que podemos hacer más con menos, lo que afecta directamente nuestros resultados.

Por tanto, la elección y el rendimiento de un marco son muy importantes para nosotros.

En palabras de TechEmpower en cuanto a las motivaciones para establecer sus puntos de referencia:

El rendimiento de las aplicaciones se puede asignar directamente a los dólares de alojamiento, y para las empresas, tanto grandes como pequeñas, los costes de alojamiento pueden ser un problema.

El rendimiento débil también puede causar problemas de escala prematuros y costosos al requerir esfuerzos de optimización anteriores y una mayor complejidad arquitectónica.
Por último, las aplicaciones lentas producen una mala experiencia de usuario y pueden sufrir sanciones impuestas por los motores de búsqueda.

¿Qué pasaría si construir una aplicación en un marco significara que, en el mejor de los casos, su hardware es adecuado para una décima parte de la carga que
sería si hubieras elegido un marco diferente?

Esto se ha vuelto aún más importante con el alojamiento basado en la nube; donde en lugar de pagar un costo fijo por un servidor,
usted paga solo por lo que necesita y el uso de eso con una granularidad por minuto.

¿Qué son .NET Core y ASP.NET Core?

Son marcos totalmente de código abierto de .NET Foundation; comúnmente usado con
C #, VB.NET
y F # lenguajes que también son de código abierto y están diseñados en GitHub.

Se ejecutan en el “Common Language Runtime” de código abierto que tiene el objetivo:

El objetivo de CLR es facilitar la programación: del Libro del tiempo de ejecución

.NET Core y ASP.NET Core nacieron en el código abierto de .NET y la reinvención de ASP.NET;
que también los llevó de Windows solo a multiplataforma;
además, admite macOS y versiones de Linux, BSD y agrega ARM a los conjuntos de chips compatibles.

La comunidad .NET ha adoptado el código abierto de .NET;
y su progreso nunca ha sido tan vibrante. ¡Ha comenzado un renacimiento de .NET!

(Gráfico siguiente de: Matt Warren’s: Open Source .NET – 4 años después)

Si bien se basa en el objetivo original de .NET de ser altamente productivo para permitir a los desarrolladores lograr más;
a lo largo del viaje, obtuvieron un enfoque láser en el rendimiento para que sus servidores también puedan lograr más.

¿Listo para la producción?

Sí, usamos .NET Core y ASP.NET Core, Bing.com los usa
y el servidor web Kestrel de ASP.NET Core ya es el 12 servidor web más utilizado en Internet
a pesar de que se lanzó por primera vez hace menos de 2,5 años.

¡Salta, el agua está caliente!

ASP.NET Core 3.0 (versión preliminar 2)

Cada versión de .NET Core ha realizado grandes mejoras en el rendimiento tanto en las bibliotecas centrales del marco (ejemplos en 2.0
y en 2.1) e introduciendo nuevos tipos y conceptos para permitir un mayor rendimiento:

Continuando con estas mejoras, hay muchos cambios en .NET Core 3.0 Preview 2 pero
quizás el más importante para nosotros es la API de intrínsecos de hardware .NET

Están llegando los intrínsecos dependientes de la plataforma. Gracias por el trabajo de todos en este proyecto. https://t.co/oK84LFJeU8

– Fei Peng (@fiigii)

Lo que permite que los elementos intrínsecos del hardware Intel SSE, SSE2, AVX2 y Arm / Arm64 SIMD se utilicen directamente desde el código administrado
(p.ej
dotnet / coreclr # 22127,
dotnet / coreclr # 2107, dotnet / coreclr # 22187, dotnet / coreclr # 22118);
y muchos aspectos del tiempo de ejecución se están moviendo de la parte C ++ del tiempo de ejecución a C #, donde el JIT puede fácilmente
apuntar exactamente a la CPU en la que se está ejecutando y lograr un mayor rendimiento (por ejemplo, dotnet / coreclr # 21729).

Asignaciones reducidas

Uno de los grandes enfoques del trabajo de desempeño en los marcos ha sido reducir las asignaciones; cuanto menos asignaciones, menos trabajo tiene que hacer el recolector de basura.

Las asignaciones y el rendimiento de la máquina de estado asíncrona de .NET se han mejorado drásticamente:

Es impresionante cuánto se redujeron las asignaciones para la máquina de estado ‘async / await’ en .NET Core 2.2 (felicitaciones a @STeplyakov por la gran herramienta https://t.co/cACIXg5u6A) pic.twitter.com/mJzoFNBO03

– Matt Warren (@matthewwarren)

Al igual que las asignaciones en ASP.NET Core:

Instantánea de 1 millón de solicitudes haciendo una respuesta fragmentada de “Hola mundo” en 2.2 vs 3.0 https://t.co/4PmXMQN7SX Core #dotnetcore #aspnetcore #performance pic.twitter.com/2rkPw3MlaO

– David Fowler #BlackLivesMatter (@davidfowl)

Asignaciones cero

De hecho, combinado con la fusión de estas dos solicitudes de extracción (PR)
aspnet / AspNetCore # 4601 y dotnet / coreclr # 21159
las asignaciones de estado estacionario para texto sin formato en el nivel de plataforma se han eliminado por completo y ahora es asignación cero.

¿Qué aspecto tienen las asignaciones cero?

Ejecutando una prueba de conexión de 6 minutos y 64 en localhost:

Produce 122,946,688 solicitudes y respuestas HTTP; y las asignaciones?

¡Menos de 1 MB asignado en total para procesar más de 122 millones de solicitudes y generar sus respuestas!

Monitoreo continuo del desempeño

Antes mencioné “un enfoque en el rendimiento similar al de un láser”; ¿Pero, qué significa esto realmente?

Todos los repositorios de ASP.NET Core tienen micro-benchmarks usando la gran herramienta BenchmarkDotNet
para verificar de forma aislada los cambios y cómo afectarán al rendimiento.

Sin embargo, lo que es más importante, hay un conjunto completo de evaluaciones comparativas del sistema completo de más de 100 escenarios,
que luego se ejecutan tanto en Linux como en Windows, servidores físicos y en la nube para un total de más de 400 pruebas de rendimiento del sistema completo,
funcionando continuamente como parte de su Integración Continua (CI) varias veces al día para detectar cualquier regresión temprano.

Panel de rendimiento público

Como su código completamente abierto y abierto a contribuyentes; las 10 páginas completas de todos los KPI de rendimiento y gráficos de series de tiempo
está completamente disponible y es público: aspnet / Benchmarks Results

En la página “KPI: líneas de base”:

Ya vimos lo rápido que era ASP.NET Core; pero mirando el tablero muestra
ASP.NET Core 3.0 ya es un 30% más rápido que ASP.NET Core 2.2 para algunos escenarios!

También puede ver que la vista previa de 3.0 se rastrea y se compara con todas las versiones anteriores
al igual que todos los parches actuales y versiones de servicio; para que no haya impactos sorpresa
de cualquier parche.

No es solo público; pero el tablero se muestra continuamente en las oficinas de Microsoft:

¡Finalmente obtuvimos nuestro televisor de reemplazo, por lo que el panel de control #aspnetcore SmurfLab está de nuevo en funcionamiento! pic.twitter.com/64VbCLoXXr

– Damian Edwards 😷🌈 # BlackLivesMatter (@DamianEdwards)

Más que rendimiento bruto

Así como rendimiento; latencia; tiempo desde el arranque en frío hasta la primera respuesta, y el uso de la memoria es
seguido de cerca en el tiempo; para cada escenario.

El uso de memoria para ASP.NET Core 3.0 se reduce considerablemente:

El tiempo de inicio en frío hasta la primera respuesta ha mejorado en .NET 3.0 con características como ReadyToRun (AoT)
y compilación por niveles;
que cuando se combinan brindan tanto un arranque mejorado como un rendimiento en estado estable mejorado:

Bueno para escenarios sin servidor como funciones de Azure y AWS Lambda; así como la primera puesta en marcha de un nuevo contenedor, VM o servidor al escalar horizontalmente; o actualización de implementación.

Rendimiento en tiempo de ejecución

También se realiza un seguimiento del rendimiento por debajo de ASP.NET Core en los niveles inferiores de la pila.
El tiempo de ejecución de .NET Core también se supervisa continuamente; en Windows, Linux, macOS, ARM;
y el repositorio dotnet / performance contiene puntos de referencia utilizados para probar el rendimiento de .NET Frameworks.

Las regresiones se detectan e informan rápidamente para que se puedan abordar:

ASP.NET Core: muy rápido y cada vez más rápido

.NET y ASP.NET siempre han sido muy productivos; y el futuro con
ASP.NET Core y .NET Core son igualmente productivos, pero también rápidos; ¡muy rapido!

Manténgase al día con las últimas noticias y desarrollos, ¡no le enviaremos spam ni le enviaremos su correo electrónico!

Este contenido se publicó originalmente aquí.