Cloudflare cambió a Pingora, su propio proxy escrito en Rust
Cloudflare dio a conocer hace poco que está migrando su red de entrega de contenido para usar el proxy «Pingora», el cual se destaca por estar escrito en Rust. El nuevo proxy reemplazó la configuración basada en el servidor NGINX con secuencias de comandos Lua y maneja más de un billón de solicitudes por día.
Se observa que la transición al proxy especializado «Pingora» permitió no solo implementar nuevas funciones y aumentar la seguridad debido al trabajo seguro con la memoria, sino que también condujo a un aumento significativo en el rendimiento y el ahorro de recursos.
Una solución basada en Pingora no requiere el uso de Lua y utiliza una arquitectura optimizada para la carga de Cloudflare, por lo que consume un 70 % menos de recursos de CPU y un 67 % menos de memoria mientras procesa la misma cantidad de tráfico.
Durante mucho tiempo, un sistema de proxy de tráfico entre usuarios y servidores finales basado en scripts NGINX y Lua satisfacía las necesidades de Cloudflare, pero a medida que la red crecía y su complejidad aumentaba, una solución universal no era suficiente, tanto en términos de rendimiento como de limitaciones en la extensibilidad e implementación de nuevas oportunidades para los clientes.
En particular, hubo dificultades para agregar funcionalidad más allá de una simple puerta de enlace y un equilibrador de carga. Por ejemplo, en el caso de que el servidor no pudiera procesar una solicitud, era necesario redirigir la solicitud a otro servidor, proporcionándole un conjunto diferente de encabezados HTTP.
En lugar de una arquitectura con solicitudes divididas en procesos de trabajo separados (trabajadores), Pingora usa un modelo de subprocesos múltiples, que en los escenarios de uso de Cloudflare (alta concentración de tráfico de diferentes sitios con un gran cambio estadístico) mostró una distribución más eficiente de recursos entre núcleos de CPU.
En particular, vincular solicitudes desequilibradas a procesos en nginx condujo a una carga desequilibrada en los núcleos de la CPU, como resultado de lo cual las solicitudes que consumen muchos recursos y el bloqueo de E/S ralentizaron el procesamiento de otras solicitudes.
Además, vincular el grupo de conexiones a los procesos del controlador no permitía reutilizar las conexiones ya establecidas de otros procesos del controlador, lo que reduce la eficiencia cuando hay una gran cantidad de procesos del controlador.
La introducción de Pingora permitió reducir 160 veces el número de operaciones de establecimiento de nuevas conexiones y aumentar la proporción de solicitudes reutilizadas del 87,1 % al 99,92 %. Además de reducir las reconexiones y un uso más eficiente de los núcleos de la CPU, la mejora del rendimiento del nuevo proxy se debió principalmente a la eliminación de los lentos controladores de Lua que se usan con nginx.
Se eligió el lenguaje Rust porque permite un alto rendimiento combinado con la disponibilidad de herramientas seguras para la memoria. Se menciona que a pesar de la alta calificación de los ingenieros de Cloudflare y la revisión de código, los programas escritos en lenguaje C no pudieron evitar errores que derivan en problemas de memoria (por ejemplo, una vulnerabilidad en el analizador HTML).
En cuanto al nuevo código, hablamos de casos de análisis de bloqueos en Pingora, que resultaron ser causados no por problemas en la aplicación, sino por un error en el kernel de Linux y fallas de hardware.
Adicionalmente, se puede señalar que Linus Torvalds comentó sobre la inclusión de soporte para el lenguaje Rust en el kernel de Linux, expresado en la conferencia Open-Source Summit Europe que se lleva a cabo estos días. El kernel 6.0 no incluía parches para desarrollar controladores de dispositivos en el lenguaje Rust, pero según Linus, es probable que se acepten en el kernel 6.1, no va a aprovechar la integración.
Como motivo para agregar soporte para Rust, además de un impacto positivo en la seguridad, Linus también aprovecha la oportunidad para aumentar el interés en trabajar en el núcleo de los nuevos participantes, lo cual es importante en el contexto del envejecimiento de los veteranos.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.