2025/09/26 15:14 Fast UDP I/O for Firefox in Rust

やっほー、ロボ子!今日のITニュースはFirefoxのQUIC UDP I/Oスタックの書き換えについてじゃ。

QUICですか、博士。HTTP/3で使われている技術ですね。それがどう書き換えられたんですか?

そうじゃ、HTTP/3じゃ。FirefoxのHTTPトラフィックの約20%がHTTP/3を使っておるらしいぞ。で、今回のプロジェクトは、もっと効率的なUDP I/Oのために、最新のシステムコールを使うように書き換えたらしい。

なるほど。以前はNSPRというものを使っていて、POSIXのsendtoやrecvfromのラッパーであるPR_SendToやPR_RecvFromというAPIを使っていたんですね。

その通り!でも、今のOSはもっと進化していて、sendmmsgやrecvmmsgみたいなマルチメッセージAPIや、GSO/GROみたいなセグメンテーションオフロードを提供しているものもあるからの。これらを使うことで、もっと効率的なデータ転送ができるようになるのじゃ。

マルチメッセージAPIやセグメンテーションオフロードですか。具体的にどう効率が上がるんですか?

マルチメッセージAPIを使うと、一度のシステムコールで複数のUDPデータグラムを送受信できるからの。セグメンテーションオフロードは、大きなUDPデータグラムをカーネルに送ると、ネットワークインターフェースが自動的に分割してくれるのじゃ。これによって、CPUの負荷が減って、スループットが上がるというわけじゃ。

なるほど、効率的ですね!それで、具体的に何をしたんですか?

まず、NSPRの使用をquinn-udpというRustのライブラリに置き換えたのじゃ。これは、メモリセーフな言語を使うことでセキュリティを向上させるためじゃ。そして、UDPデータグラム処理パイプラインを書き換えて、データグラムのバッチを送受信するようにしたのじゃ。

Rustを選んだのは、FirefoxのQUICステートマシン自体がすでにRustで実装されているからなんですね。マルチプラットフォーム対応も大変だったんじゃないですか?

そうじゃ、FirefoxはWindows、Android、MacOS、Linuxと、色々なOSをサポートしているからの。特に古いバージョンのサポートが大変だったみたいじゃな。例えば、Windows on ARMでWSLが有効になっていると、UROを使ったWSARecvMsg呼び出しがうまくいかないバグがあったり、Android APIレベル25以下だと、ECNビットが設定されたsendmsgを呼び出すとエラーが返ってきたり…。

色々なOSで細かい挙動の違いがあるんですね。それを一つ一つ潰していくのは大変そうです。

じゃろ?でも、その甲斐あって、CPUバウンドのベンチマークでは、1Gbit/s未満から4Gbit/sへの向上が見られたらしいぞ!

それはすごいですね!

じゃろじゃろ?しかも、Firefoxが主要なオペレーティングシステム全体で最新のシステムコールを使用することで、IP ECNのような補助データを送受信できるようになったのじゃ。QUIC接続の約50%がECNアウトバウンド対応パスで実行されているらしいぞ。

ECNですか。輻輳を緩和するための技術ですね。それが使えるようになったのは大きいですね。

そういうことじゃ!今回のプロジェクトで、FirefoxのQUIC UDP I/Oスタックを、quinn-udpを使った最新のメモリセーフな実装に置き換えることに成功したのじゃ!

素晴らしい成果ですね!

じゃろ?最後にクイズじゃ!FirefoxのUDP I/Oスタックを書き換えたのは誰でしょう?

えーっと…、開発チームの皆さん、でしょうか?

ブー!正解は…、Firefoxを使ったあなたじゃ!なぜなら、使ってくれてありがとう!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。