- Wenn sich ein Client mit Discord verbindet, erhält er über einen Dienst namens „Gateway“ Echtzeit-Updates darüber, was gerade passiert
- Seit Ende 2017 werden die Gateway-Verbindungen der Clients mit
zlib komprimiert, wodurch die Nachrichtengröße auf ein Zwei- bis Zehntel schrumpfte
- Zstandard (
zstd) bietet eine bessere Kompressionsrate als zlib, benötigt weniger Zeit zum Komprimieren und unterstützt Dictionaries, die die Bandbreite zusätzlich senken können
- Die Testergebnisse mit
zstd im Jahr 2019 waren nicht besonders positiv, dennoch entschied man, dass ein neuer Versuch lohnenswert sei
Zstd-Streaming
zlib nutzte Streaming-Komprimierung, zstd dagegen zunächst nicht
- Bei kleinen Payloads schnitt
zstd schlechter ab als zlib
- Das
zstd-Binding für Elixir, ezstd, wurde geforkt und um Streaming erweitert
- Nach der Umstellung auf
zstd-Streaming gab es gegenüber zlib-Streaming deutliche Verbesserungen bei Kompressionsrate und Geschwindigkeit
Optimierungsarbeit
Tuning
chainlog, hashlog, windowlog und andere zstd-Kompressionsparameter wurden angepasst, um ein Gleichgewicht zwischen Speicherverbrauch und Kompressionszeit zu finden
Zstd-Dictionaries
- Es wurde versucht, die Dictionary-Funktion von
zstd zu nutzen, um die Kompressionsrate zu erhöhen, der Effekt war jedoch begrenzt
- Da die Komplexität des Einsatzes größer als der Nutzen war, entschied man sich gegen die Einführung
Buffer-Upgrade
- Es wurde ein Feedback-Loop implementiert, der überschüssigen Speicher in Zeiten geringer Auslastung nutzt, um
zstd-Buffer upzugraden
- Die Upgrade-Rate fiel niedriger aus als erwartet; Verbesserungen wurden etwa durch Anpassungen an den Einstellungen des BEAM-Allocators versucht, aber wegen des im Verhältnis geringen Nutzens wieder verworfen
Implementierung und Rollout
- Da die Bandbreitenverbesserungen durch
zstd groß waren, wurde entschieden, es nicht nur auf Mobilgeräten, sondern auch auf dem Desktop einzusetzen
- Passende
zstd-Bindings für Java, Objective-C, Rust und andere Plattformen wurden gefunden und über mehrere Monate schrittweise ausgerollt
Zusätzlicher Erfolg: Passive Sessions V2
- Während der Einführung von
zstd wurde festgestellt, dass die Nachricht passive_update_v1 mehr als 30 % der Gateway-Bandbreite ausmachte
- Mit der Einführung von
passive_update_v2, das nur geänderte Kanäle/Mitglieder sendet, wurde dieser Anteil von 35 % auf 5 % gesenkt
Große Einsparungen
- Die Kombination aus Passive Sessions v2 und
zstd reduzierte die vom Client genutzte Gateway-Bandbreite um fast 40 %
- Das Entdecken unbeabsichtigter Optimierungsmöglichkeiten zeigt, wie wichtig es ist, mit der richtigen Instrumentierung und einer kritischen Analyse von Graphen zu arbeiten
1 Kommentare
Hacker-News-Kommentare
Es gibt Beschwerden darüber, dass der Start von Discord 20–30 Sekunden dauert
Der Fokus scheint auf Kompressionsraten und der Reduzierung der Netzwerkbandbreite gelegen zu haben
Der wörterbuchbasierte Kompressionsansatz mit JSON und Erlang ETF ist interessant
Es ist überraschend, dass eine typische Bootstrapping-Antwort (
READY) mehr als 2 MB groß istEs wird auf den tatsächlichen Inhalt des
PASSIVE_UPDATE_V1-Dispatches hingewiesenEs gibt keinen Hinweis darauf, ob Angriffe wie Compression-Oracle-Attacken (BREACH) sicher abgewehrt werden
Wenn ein Discord-Tab geöffnet ist, wird der Computer langsam
Es ist sehr gut, dass auch Dinge beschrieben wurden, die ausprobiert wurden, aber nicht funktioniert haben
Die Meinung, dass mIRC es besser gemacht hat