動機
- 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件のコメント
Hacker Newsの意見
Cloudflareの内部ヘッダーの保存および削除方式について、さまざまな推測をしていた
CFIntで始まるUTF-8文字をビットマスクにマッピングすることについて、最初は非効率だと思っていた
a-zと6つの特殊文字を含められるA-Zと6つの特殊文字を含められるCloudflareの最適化に価値があるのかという疑問
データ構造の最適化にはあまり詳しくないが、ハッシュテーブルをすぐに除外したのは意外だった
fancyなデータ構造を使って削除対象の項目を構成し、それに基づいてヘッダーマップから削除している
remove_header呼び出しが関係するコードリンクを提供しているTrieを使ったブログ記事がついに出た
小さなBloom Filterを試したのか気になる
静的な項目集合をマッチさせる場合、完全ハッシュテーブルを試したのか気になる
この最適化は興味深い
なぜregex crateの方がうまく機能しなかったのか気になる