Motivation
- Le réseau mondial de Cloudflare traite plus de 60 millions de requêtes HTTP par seconde
- Utilisation d'une nouvelle crate Rust open source pour réduire l'utilisation CPU et améliorer la capacité de traitement du CDN
- Pingora est au cœur du service proxy basé sur Rust de Cloudflare, désormais publié en open source
- Le service Pingora-origin a pour rôle de transmettre les requêtes des utilisateurs vers leur destination réelle
- Lorsque les requêtes quittent Cloudflare, il est nécessaire de supprimer les informations internes
- Cette opération se produit très fréquemment et représente 1,7 % de l'utilisation CPU
Benchmarking
- Utilisation de la crate Rust Criterion pour mesurer les performances de la fonction à l'échelle de la nanoseconde
- La fonction
clear_internal_headers d'origine prenait en moyenne 3,65µs
Réduire les opérations de lecture
- Réduction des lectures en inversant le sens de suppression des en-têtes
- Ce changement a amélioré le temps d'exécution de la fonction de 3,65µs à 1,53µs
- Réduction de l'utilisation CPU de 1,71 % à 0,717 %
Recherche dans les structures de données
- Tentative de stockage et de recherche des en-têtes internes à l'aide d'une table de hachage
- Le temps de lecture d'une table de hachage est linéairement proportionnel à la longueur de la clé
- Essais avec d'autres structures de données, comme un ensemble trié ou une machine à états
- Une implémentation avec des expressions régulières est deux fois plus lente qu'une table de hachage
Utilisation d'un trie
- Un trie est une structure de données en arbre utilisée pour la recherche par préfixe ou les systèmes d'autocomplétion
- Un trie peut identifier rapidement les cas où une chaîne n'est pas présente
- Les implémentations de trie existantes sont plus lentes qu'une table de hachage
- Cloudflare a développé sa propre implémentation de trie optimisée, appelée trie-hard
Trie Hard
- trie-hard stocke les relations entre nœuds dans les bits d'entiers et utilise la mémoire de manière contiguë pour gagner en vitesse
- Réduction du temps d'exécution de la fonction
clear_internal_headers à 0,93µs
- Réduction de l'utilisation CPU de 1,71 % à 0,43 %
- En production réelle, les performances de trie-hard correspondent aux benchmarks
Conclusion
- Il est important d'identifier les parties lentes du code et de les optimiser
- De petites optimisations peuvent s'additionner pour produire de gros gains de performance
- Le connectivity cloud de Cloudflare fournit des fonctions comme la protection du réseau, l'accélération des applications Internet et la défense contre les attaques DDoS
Le résumé de GN⁺
- Cloudflare réduit l'utilisation CPU et améliore la capacité de traitement de son CDN grâce à une nouvelle crate Rust open source
- L'optimisation de la suppression des en-têtes internes dans le service Pingora-origin réduit l'utilisation CPU de 1,28 %
- Cloudflare a développé sa propre implémentation de trie optimisée, trie-hard, pour améliorer fortement les performances
- Cet article souligne l'importance de l'optimisation du code et du choix des structures de données, et montre que de petites optimisations peuvent produire de gros gains de performance
- Parmi les projets offrant des fonctions similaires, on peut citer NGINX et HAProxy
1 commentaires
Commentaires sur Hacker News
Plusieurs hypothèses ont été formulées sur la façon dont Cloudflare stocke et supprime les en-têtes internes
Au départ, l’idée de mapper des caractères UTF-8 vers un bitmask semblait inefficace
a-zet six caractères spéciauxA-Zet six caractères spéciauxDes doutes existent sur la valeur réelle de l’optimisation de Cloudflare
Sans être très au fait des optimisations de structures de données, certains sont surpris que la table de hachage ait été écartée si vite
Une structure de données sophistiquée est utilisée pour définir les éléments à supprimer, puis les retirer de la map d’en-têtes sur cette base
remove_headerest fourniUn billet de blog utilisant un trie est enfin sorti
Certains se demandent si un petit filtre de Bloom a été essayé
Certains se demandent si une table de hachage parfaite a été testée pour faire correspondre un ensemble statique d’éléments
L’optimisation est jugée intéressante
Certains se demandent pourquoi la crate regex n’a pas donné de meilleurs résultats