2 ポイント 投稿者 GN⁺ 2024-09-11 | 1件のコメント | WhatsAppで共有

動機

  • Cloudflareのグローバルネットワークは、毎秒6,000万件を超えるHTTPリクエストを処理している
  • 新しいオープンソースのRust crateを使ってCPU使用量を削減し、CDNの処理能力を向上させた
  • PingoraはCloudflareのRustベースのプロキシサービスの中核であり、これをオープンソースとして公開した
  • Pingora-originサービスは、ユーザーのリクエストを実際の宛先へ転送する役割を担う
  • リクエストがCloudflareを離れる際には、内部情報を取り除く作業が必要になる
  • この作業は非常に高頻度で発生し、CPU使用量の1.7%を占めていた

ベンチマーキング

  • Criterion Rust crateを使って、関数の性能をナノ秒単位で測定した
  • 元のclear_internal_headers関数は平均3.65µsを要した

読み取り処理の削減

  • ヘッダーを削除する方向を逆にして、読み取り処理を減らした
  • この変更により、関数の実行時間は3.65µsから1.53µsへ改善した
  • CPU使用量を1.71%から0.717%へ削減した

データ構造の探索

  • ハッシュマップを使って内部ヘッダーを保存・検索する方法を試した
  • ハッシュマップの読み取り時間はキー長に比例して線形に増える
  • ソート済み集合や状態機械のような別のデータ構造も試した
  • 正規表現を使った実装はハッシュマップより2倍遅かった

トライの利用

  • トライは接頭辞検索やオートコンプリートシステムで使われる木構造のデータ構造である
  • トライは文字列が含まれていない場合を素早く識別できる
  • 既存のトライ実装はハッシュマップより遅かった
  • Cloudflareは独自に最適化したトライ実装であるtrie-hardを開発した

Trie Hard

  • trie-hardは、ノード間の関係を整数のビットに格納し、メモリを連続的に使うことで高速化している
  • clear_internal_headers関数の実行時間を0.93µsまで短縮した
  • CPU使用量を1.71%から0.43%へ削減した
  • 実際の本番環境でも、trie-hardの性能はベンチマークと一致した

結論

  • コードの遅い部分を特定して最適化することが重要である
  • 小さな最適化の積み重ねが大きな性能向上につながる
  • Cloudflareのコネクティビティクラウドは、ネットワーク保護、インターネットアプリケーションの高速化、DDoS攻撃防御などの機能を提供する

GN⁺のまとめ

  • Cloudflareは、Rustベースの新しいオープンソースcrateを通じてCPU使用量を削減し、CDNの処理能力を向上させた
  • Pingora-originサービスにおける内部ヘッダー削除処理を最適化し、CPU使用量を1.28%削減した
  • trie-hardという独自に最適化したトライ実装を開発し、性能を大幅に改善した
  • この記事は、コード最適化とデータ構造選択の重要性を強調し、小さな最適化が大きな性能向上をもたらしうることを示している
  • 類似機能を持つプロジェクトにはNGINX、HAProxyなどがある

1件のコメント

 
GN⁺ 2024-09-11
Hacker Newsの意見
  • Cloudflareの内部ヘッダーの保存および削除方式について、さまざまな推測をしていた

    • 別個の辞書やデータ構造を使う
    • すべての内部メタデータを含む単一のヘッダー
    • すべてのヘッダーに接頭辞を付け、内部は「I」、外部は「E」で始める
    • すべての内部ヘッダーはCFIntで始まる
    • 特定の一覧にあるヘッダーを内部ヘッダーとみなす方式だとは予想していなかった
    • Webはすでに曖昧なシグナルやヘッダー名であふれている
    • Cloudflareのような大規模企業が、このようなミスを起こしやすいメカニズムを使っているのは奇妙だ
  • UTF-8文字をビットマスクにマッピングすることについて、最初は非効率だと思っていた

    • 32ビットでa-zと6つの特殊文字を含められる
    • 64ビットで大文字のA-Zと6つの特殊文字を含められる
    • HTTPヘッダーに十分な空間を提供し、高速なマッチングアルゴリズムを可能にする
    • この技術はBloom Filterである
    • 1970年代の資源が限られていた時代に開発された技術だが、今でも有用に使われている
  • Cloudflareの最適化に価値があるのかという疑問

    • 約500個のCPUコアを節約した
    • Cloudflareのコストは分からないが、数万ドル程度の節約が見込まれる
    • エンジニアリングに対して前向きなROIを期待できるのか疑問だ
    • フィルターを逆シリアライズ段階で適用し、ヘッダーが生成されないようにする方がよいかもしれない
  • データ構造の最適化にはあまり詳しくないが、ハッシュテーブルをすぐに除外したのは意外だった

    • 静的テーブルを検索するなら、ハッシュテーブルの方が速いと思っていた
  • fancyなデータ構造を使って削除対象の項目を構成し、それに基づいてヘッダーマップから削除している

    • remove_header呼び出しが関係するコードリンクを提供している
  • Trieを使ったブログ記事がついに出た

    • Trie関連の問題に取り組んできたのは無駄ではなかった
  • 小さなBloom Filterを試したのか気になる

    • ヘッダーキーに対する高速な畳み込みとBloom Filterテストで、Trieをたどるのを避けられるかもしれない
  • 静的な項目集合をマッチさせる場合、完全ハッシュテーブルを試したのか気になる

    • いくつかの算術演算と1回の文字列比較まで減らせる
  • この最適化は興味深い

    • リクエスト生成時にヘッダーを内部用としてタグ付けできたのか気になる
    • 出力時のフィルタリングが簡単になる
  • なぜregex crateの方がうまく機能しなかったのか気になる

    • 複数のリテラル文字列検索をAho-Corasickオートマトンにコンパイルすべきだからだ