23 Punkte von GN⁺ 2024-09-23 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-09-23
Hacker-News-Kommentare
  • Es gibt Beschwerden darüber, dass der Start von Discord 20–30 Sekunden dauert

    • Es wird infrage gestellt, warum der Start selbst auf einem 5000-$-PC so langsam ist
    • Es wird der Vergleich verwendet, als würde der Client jedes Mal erneut für einen einzelnen CPU-Kern kompiliert
  • Der Fokus scheint auf Kompressionsraten und der Reduzierung der Netzwerkbandbreite gelegen zu haben

    • Es gibt keine Erwähnung von CPU-Zeit oder tatsächlich für Nutzer messbaren Verbesserungen
    • Als man im eigenen Unternehmen etwas Ähnliches versucht hat, wurde die Performance wegen des Overheads für Kompression/Dekompression schlechter
  • Der wörterbuchbasierte Kompressionsansatz mit JSON und Erlang ETF ist interessant

    • Statt auf schema-basierte Systeme wie Cap'n Proto oder Protobufs umzusteigen, wurde dieser Ansatz gewählt
    • Es besteht Interesse an Benchmarks für Zstandard und LZ4
    • Für Streaming-Overlay-/HUD-Daten von Drohnen wurde LZ4 verwendet; mit einem per Zstd-Dictionary-Tool erzeugten Wörterbuch wurde bei hoher Geschwindigkeit eine ähnliche Kompression erreicht
  • Es ist überraschend, dass eine typische Bootstrapping-Antwort (READY) mehr als 2 MB groß ist

  • Es wird auf den tatsächlichen Inhalt des PASSIVE_UPDATE_V1-Dispatches hingewiesen

    • Selbst wenn sich nur ein einzelnes Element geändert hat, werden alle Kanäle, Mitglieder oder Sprachmitglieder übertragen
    • Während der zstd-Experimente entdeckte Metriken zeigten überraschendes Verhalten
    • Es wird infrage gestellt, warum Metriken nicht von Anfang an analysiert wurden
    • Es wird infrage gestellt, warum nicht von Anfang an Deltas übertragen wurden
  • Es gibt keinen Hinweis darauf, ob Angriffe wie Compression-Oracle-Attacken (BREACH) sicher abgewehrt werden

    • Da Discord viel Aufwand in den Rollout der Kompression gesteckt hat, wird angenommen, dass dies berücksichtigt wurde
    • Es wird die Meinung geäußert, dass konkretere Details wünschenswert gewesen wären
  • 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

    • Artikel, die gescheiterte Versuche erklären, werden immer seltener, dabei sind sie sehr interessant und hilfreich
  • Die Meinung, dass mIRC es besser gemacht hat