23 ポイント 投稿者 GN⁺ 2024-09-23 | 1件のコメント | WhatsAppで共有
  • クライアントがDiscordに接続すると、「ゲートウェイ」と呼ばれるサービスを通じて、何が起きているかのリアルタイム更新を受け取る
  • 2017年末から、クライアントのゲートウェイ接続はzlibを使って圧縮され、メッセージサイズは2倍から10倍まで小さくなった
  • Zstandard(zstd)はzlibより圧縮率が高く、圧縮時間も短く、辞書機能をサポートしているため、帯域幅をさらに削減できる
  • 2019年のzstdテスト結果はそれほど良好ではなかったが、再挑戦する価値があると判断した

Zstdストリーミング

  • zlibはストリーミング圧縮を使用していた一方、zstdはそうではなかった
  • 小さなペイロードでは、zstdzlibより性能が劣っていた
  • Elixir向けzstdバインディングであるezstdをフォークし、ストリーミングを追加した
  • zstdストリーミングへ切り替えた結果、zlibストリーミングより圧縮率と速度の両面で大きく改善した

最適化の取り組み

チューニング

  • chainloghashlogwindowlogなどのzstd圧縮パラメータを調整し、メモリ使用量と圧縮時間のバランスを取った

Zstd辞書

  • zstdの辞書機能を活用して圧縮率を高めようとしたが、効果は限定的だった
  • 辞書利用の複雑さが利点を上回ると判断し、導入しないことにした

バッファアップグレード

  • 非ピーク時間帯の余剰メモリを活用し、zstdバッファをアップグレードするフィードバックループを実装した
  • 予想よりアップグレード率が低く、BEAMアロケータ設定の調整などで改善を試みたが、複雑さに対する利点が大きくないため撤回した

実装と展開

  • zstdの帯域幅改善効果が大きかったため、モバイルだけでなくデスクトップにも適用することにした
  • Java、Objective-C、Rustなど、各プラットフォームに合ったzstdバインディングを見つけ、数か月にわたって段階的に展開した

追加の成果: Passive Sessions V2

  • zstd適用の過程で、passive_update_v1メッセージがゲートウェイ帯域幅の30%以上を占めていることを発見した
  • 変更されたチャンネル/メンバーだけを送信するpassive_update_v2を導入し、その帯域幅を35%から5%に削減した

大きな削減効果

  • Passive Sessions v2とzstdの組み合わせにより、クライアントが使用するゲートウェイ帯域幅をほぼ40%削減した
  • 意図せず最適化の機会を発見できたことは、適切な計測と批判的な視点でグラフを分析する重要性を示している

1件のコメント

 
GN⁺ 2024-09-23
Hacker Newsの意見
  • Discordの起動に20〜30秒かかることへの不満がある

    • $5000のPCでも起動が遅いことに疑問が呈されている
    • クライアントを毎回シングルコア向けに再コンパイルしているようだ、というたとえが使われている
  • 圧縮率とネットワーク帯域幅の削減に注力したように見える

    • CPU時間や実ユーザーが体感できる改善については言及がない
    • 会社で似たような取り組みをした際、圧縮/展開のオーバーヘッドによって性能がむしろ悪化した
  • JSONとErlang ETFを使った辞書ベースの圧縮アプローチが興味深い

    • Cap'n ProtoやProtobufsのようなスキーマベースのシステムへ移行する代わりに選んだ方式
    • ZstandardとLZ4のベンチマークに関心がある
    • ドローンのストリーミングオーバーレイ/HUDデータではLZ4を使用し、Zstd辞書ツールで生成した辞書を使って高速で同様の圧縮を達成した
  • 一般的なブートストラップ応答(READY)が2MB以上ある点に驚いている

  • PASSIVE_UPDATE_V1ディスパッチの実際の内容への言及

    • 単一の要素だけが変更された場合でも、すべてのチャンネル、メンバー、またはボイスメンバーを送信している
    • zstd実験中に見つかったメトリクスが驚くべき挙動を示している
    • なぜ最初からメトリクス分析をしなかったのかという疑問
    • なぜ最初からデルタを送らなかったのかという疑問
  • 圧縮オラクル攻撃(BREACH)のような攻撃に対する安全性への言及がない

    • Discordが圧縮のロールアウトに多くの労力を費やしたことを考えると、これを考慮していたはずだと見ている
    • もっと具体的な内容を書いてほしかったという意見
  • Discordのタブを開くとコンピューターが遅くなる問題がある

  • うまくいかなかったことについても説明している点がとても良い

    • 失敗した試みを説明する記事はますます珍しくなっているが、これは非常に興味深く参考になる
  • mIRCのほうがよくできていたという意見