Cloudflare est passé de NGINX à son propre proxy Pingora, écrit en Rust

Cloudflare a annoncé la transition de son réseau de diffusion de contenu pour utiliser le proxy Pingora, écrit en langage Rust. Le nouveau proxy remplace la configuration basée sur le serveur NGINX par des scripts Lua et traite plus d'un billion de requêtes par jour. Il est à noter que la transition vers un proxy spécialisé a permis non seulement de mettre en œuvre de nouvelles fonctionnalités et d'augmenter la sécurité grâce au fonctionnement sûr de la mémoire, mais a également conduit à une augmentation significative des performances et des économies de ressources - la solution basée sur Pingora ne nécessite pas l'utilisation de Lua, et consomme donc 70 % de ressources CPU en moins et 67 % de mémoire en moins tout en traitant la même quantité de trafic.

Pendant longtemps, un système de proxy du trafic entre les utilisateurs et les serveurs finaux basé sur les scripts NGINX et Lua a satisfait aux besoins de Cloudflare, mais à mesure que le réseau s'est développé et que sa complexité a augmenté, une solution universelle s'est avérée insuffisante, tant en termes de performances et en raison des limites d’extensibilité et de mise en œuvre de nouvelles opportunités pour les clients. En particulier, il a été difficile d'ajouter des fonctionnalités au-delà d'une simple passerelle et d'un équilibreur de charge. Par exemple, il est devenu nécessaire, si le serveur ne parvient pas à traiter une requête, de renvoyer la requête à un autre serveur, en lui fournissant un ensemble d'en-têtes HTTP différent.

Au lieu d'une architecture qui sépare les requêtes en processus de travail distincts, Pingora utilise un modèle multithread qui, dans les cas d'utilisation de Cloudflare (forte concentration de trafic provenant de différents sites avec un décalage statistique important), a montré une répartition plus efficace des ressources entre les cœurs de processeur. En particulier, la liaison par nginx des requêtes déséquilibrées aux processus entraînait une charge déséquilibrée sur les cœurs du processeur, ce qui entraînait des requêtes gourmandes en ressources et un blocage des E/S ralentissant le traitement des autres requêtes. De plus, la liaison du pool de connexions aux processus de gestionnaire ne permettait pas la réutilisation de connexions déjà établies à partir d'autres processus de gestionnaire, ce qui réduit l'efficacité lorsqu'il existe un grand nombre de processus de gestionnaire.

NGINX :

Cloudflare est passé de NGINX à son propre proxy Pingora, écrit en Rust

Pingora :

Cloudflare est passé de NGINX à son propre proxy Pingora, écrit en Rust

La mise en œuvre de Pingora a permis de réduire de 160 fois le nombre d'installations de nouvelles connexions et d'augmenter la part des demandes réutilisées de 87.1% à 99.92%. En plus de réduire les reconnexions et d'utiliser plus efficacement les cœurs de processeur, l'amélioration des performances du nouveau proxy était principalement due à la suppression des gestionnaires Lua lents utilisés avec nginx.

Le langage Rust a été choisi pour obtenir des performances élevées combinées à la disponibilité d'outils permettant de garantir un fonctionnement sûr avec la mémoire. Il est mentionné que malgré les ingénieurs hautement qualifiés de Cloudflare et la révision du code écrit en langage C, il n'a pas été possible d'éviter des erreurs entraînant des problèmes de mémoire (par exemple, une vulnérabilité dans l'analyseur HTML). Quant au nouveau code, il parle de cas d'analyse d'échecs dans Pingora, qui se sont avérés causés non pas par des problèmes dans l'application, mais par une erreur dans le noyau Linux et des pannes matérielles.

De plus, nous pouvons noter le commentaire de Linus Torvalds, exprimé lors de la conférence Open-Source Summit Europe qui a lieu ces jours-ci, concernant l'inclusion du support du langage Rust dans le noyau Linux. Les correctifs pour développer des pilotes de périphériques dans le langage Rust n'étaient pas inclus dans le noyau 6.0, mais selon Linus, ils seront très probablement acceptés dans le noyau 6.1 ; il ne va pas retarder l'intégration. Comme motivation pour ajouter la prise en charge de Rust, outre l'impact positif sur la sécurité, Linus cite également la possibilité d'accroître l'intérêt pour le travail sur le noyau de nouveaux participants, ce qui est important dans le contexte des anciens vieillissants.

Source: opennet.ru

Ajouter un commentaire