概要
- FirefoxのHTTPトラフィックの約20%が HTTP/3 (QUIC/UDPベース)を使用
- 従来の NSPRベースUDP I/O から、 Rust/quinn-udp による最新システムコール活用へ移行
- パフォーマンス向上 と セキュリティ強化 を両立
- OSごとの最適化・課題とその対応
- 本プロジェクトの知見は他プロジェクトにも有用
FirefoxのUDP I/O最適化プロジェクト
- HTTP/3(QUIC) の普及により、FirefoxのUDPトラフィックが増加傾向
- 従来利用していた NSPR は古く、提供API(PR_SendTo, PR_RecvFrom)は限定的
- 現代OS ではsendmmsg/recvmmsgやGSO/GROなど 高効率API が利用可能
- 本プロジェクトの目的
- 最新システムコールによる UDP I/O高速化
- メモリ安全 なRustによる実装でセキュリティ向上
- 既存の QUIC実装(Rust) との統合性確保
- quinn-udp (Rust製QUIC実装QuinnのUDP I/Oライブラリ)をベースに開発効率化
- 2025年には 大多数のFirefoxユーザーへ展開、最大4倍のスループット向上を確認
UDP I/Oの基本と最適化手法
- 従来方式
- 1パケットずつsendto/recvfromで送受信
- ユーザ空間→カーネル空間の往復コストが高い
- バッチ送受信
- sendmmsg/recvmmsg等により 複数パケットを一括処理
- オーバーヘッド削減による効率化
- セグメンテーションオフロード
- GSO/GRO等により 大きなパケットをカーネル/ハードウェアで分割・結合
- アプリ側の処理負荷軽減、NICの性能活用
NSPRからquinn-udpへの置き換え
- 初期段階
- まずは1パケットずつの送受信で quinn-udp を導入
- Mozilla QUICクライアント・サーバのテスト実装を更新
- バッチ処理対応
- QUIC実装内のUDP処理パイプラインを バッチ処理型 へ改修
- マルチメッセージAPI や セグメンテーションオフロード の両方に対応
- I/O高速化 やインプレース暗号化処理も追加
各プラットフォームの詳細と課題
Windows
- WSASendMsg/WSARecvMsg で1パケット送受信または大きなセグメント送受信が可能
- USO/URO (LinuxのGSO/GRO相当)対応を試みるも、互換性・安定性問題が発生
- ARM64/WSL環境で URO利用時のバグ (セグメントサイズ未取得)によりページロード失敗
- USO利用時に パケットロス増加 や ドライバクラッシュ報告 もあり
- 現状、 URO/USOは無効化 し安定運用を優先
MacOS
- sendmsg/recvmsg への置き換えは問題なし
- UDPセグメンテーションオフロード非対応
- sendmsg_x/recvmsg_x (非公開API)によるバッチ送受信も検討
- 仕様不明・将来の削除リスクから 正式リリース見送り
Linux
- sendmmsg/recvmmsg によるバッチ送受信と GSO/GRO によるセグメンテーションオフロードに完全対応
- quinn-udp はGSOを優先採用、Firefoxでも同様方針
- 1コネクション1ソケット 運用でプライバシー強化
- GSO/GROの4タプル制限は問題にならず
- ネットワークサンドボックス や GSOサポート判定 など細かな対応も実施
Android
- AndroidはLinuxとは別物、特に古いAPIやx86(32bit)サポートで苦労
- x86では socketcall経由 でシステムコールする必要があり、セキュリティフィルタとの兼ね合いで問題発生
- APIレベル25以下 ではECNビット付きsendmsgでエラー発生、リトライで回避
- quinn-udpの改善恩恵 をFirefoxも享受
今後と知見の共有
- quinn-udp を利用する他プロジェクトにも有用な知見
- OSごとのI/O最適化ノウハウ やバグ回避策の蓄積
- パフォーマンス計測 やデバッグ手法(例:WiresharkのGSO未対応問題)
- 今後の課題
- WindowsのUSO/URO安定化
- MacOSの公式API対応状況
- Androidのさらなる互換性強化
このプロジェクトは、 FirefoxのUDP I/O性能とセキュリティを大幅に向上 させたのみならず、 マルチプラットフォーム対応の難しさや最適化の知見 を広く提供するものです。他のUDP高速化を目指すプロジェクトにも役立つ情報源となります。