Motivation
- Das globale Netzwerk von Cloudflare verarbeitet mehr als 60 Millionen HTTP-Anfragen pro Sekunde
- Mit einer neuen Open-Source-Rust-Crate wurde die CPU-Auslastung gesenkt und die Verarbeitungskapazität des CDN verbessert
- Pingora ist der Kern von Cloudflares Rust-basiertem Proxy-Dienst und wurde als Open Source veröffentlicht
- Der Dienst Pingora-origin übernimmt die Weiterleitung von Nutzeranfragen an das tatsächliche Ziel
- Wenn Anfragen Cloudflare verlassen, müssen interne Informationen entfernt werden
- Dieser Vorgang tritt sehr häufig auf und macht 1,7 % der CPU-Auslastung aus
Benchmarking
- Mit der Rust-Crate Criterion wurde die Performance der Funktion im Nanosekundenbereich gemessen
- Die ursprüngliche Funktion
clear_internal_headers benötigte im Durchschnitt 3.65µs
Weniger Lesezugriffe
- Die Richtung beim Entfernen der Header wurde umgekehrt, um die Anzahl der Lesezugriffe zu verringern
- Dadurch verbesserte sich die Laufzeit der Funktion von 3.65µs auf 1.53µs
- Die CPU-Auslastung sank von 1.71 % auf 0.717 %
Suche in Datenstrukturen
- Es wurde versucht, interne Header mit einer HashMap zu speichern und nachzuschlagen
- Die Lesezeit der HashMap ist linear proportional zur Schlüssellänge
- Auch andere Datenstrukturen wie sortierte Mengen oder Zustandsmaschinen wurden ausprobiert
- Eine Implementierung mit regulären Ausdrücken war doppelt so langsam wie die HashMap
Einsatz eines Trie
- Ein Trie ist eine Baumdatenstruktur, die für Präfixsuchen oder Autovervollständigungssysteme verwendet wird
- Ein Trie kann schnell erkennen, wenn ein String nicht enthalten ist
- Bestehende Trie-Implementierungen waren langsamer als die HashMap
- Cloudflare entwickelte daher eine eigene optimierte Trie-Implementierung namens trie-hard
Trie Hard
- trie-hard speichert Knotenbeziehungen in den Bits von Integern und nutzt zusammenhängenden Speicher, um die Geschwindigkeit zu erhöhen
- Die Laufzeit der Funktion
clear_internal_headers wurde auf 0.93µs reduziert
- Die CPU-Auslastung sank von 1.71 % auf 0.43 %
- In der tatsächlichen Produktionsumgebung entsprach die Performance von trie-hard den Benchmark-Ergebnissen
Fazit
- Es ist wichtig, langsame Teile des Codes zu identifizieren und zu optimieren
- Viele kleine Optimierungen können zusammen große Performancegewinne bringen
- Cloudflares Connectivity Cloud bietet Funktionen wie Netzwerkschutz, Beschleunigung von Internetanwendungen und Abwehr von DDoS-Angriffen
Zusammenfassung von GN⁺
- Cloudflare senkte mit einer neuen Open-Source-Rust-Crate die CPU-Auslastung und steigerte die Verarbeitungskapazität seines CDN
- Durch die Optimierung der Entfernung interner Header im Dienst Pingora-origin wurde die CPU-Auslastung um 1.28 % gesenkt
- Mit trie-hard entwickelte das Unternehmen eine eigene optimierte Trie-Implementierung und verbesserte die Performance deutlich
- Der Artikel unterstreicht die Bedeutung von Code-Optimierung und der Wahl geeigneter Datenstrukturen und zeigt, dass kleine Optimierungen große Performancegewinne bringen können
- Ähnliche Projekte mit vergleichbarer Funktionalität sind unter anderem NGINX und HAProxy
1 Kommentare
Hacker-News-Kommentare
Es gab verschiedene Vermutungen darüber, wie Cloudflare interne Header speichert und entfernt
Das Abbilden von UTF-8-Zeichen auf eine Bitmaske erschien zunächst ineffizient
a-zund sechs Sonderzeichen unterbringenA-Zund sechs Sonderzeichen unterbringenZweifel daran, ob Cloudflares Optimierung den Aufwand wert ist
Kein tiefes Wissen über die Optimierung von Datenstrukturen, aber überraschend, dass Hash-Tabellen so schnell verworfen wurden
Verwendung einer fancy Datenstruktur, um zu entfernende Einträge zu organisieren und sie dann anhand dessen aus der Header-Map zu entfernen
remove_header-Aufrufstelle wurde bereitgestelltEndlich mal ein Blogpost mit einem Trie
Neugier, ob ein kleiner Bloom Filter ausprobiert wurde
Neugier, ob bei einer statischen Menge von Einträgen eine perfekte Hash-Tabelle ausprobiert wurde
Die Optimierung ist interessant
Neugier, warum das
regex-Crate nicht besser funktionierte