Hacker News 中文摘要

RSS订阅

Firefox中基于Rust的快速UDP I/O -- Fast UDP I/O for Firefox in Rust

文章摘要

这篇文章介绍了Firefox使用Rust语言重写QUIC协议的UDP I/O栈的优化项目。由于当前使用的NSPR网络库API老旧,无法利用现代操作系统提供的高性能UDP功能(如多消息API和分段卸载技术),团队从2024年中开始用Rust这一内存安全语言重构代码,旨在提升UDP I/O性能并增强安全性。该优化针对占Firefox HTTP流量20%的HTTP/3(基于QUIC协议)流量。

文章总结

标题:Firefox中基于Rust的高速UDP I/O优化

背景动机

Firefox当前20%的HTTP流量采用HTTP/3协议,该协议运行于QUIC之上,而QUIC又基于UDP传输。这意味着UDP I/O活动在浏览器中占据重要地位。

Firefox长期使用NSPR(Netscape便携运行时)处理网络I/O,但其UDP API(如PRSendTo和PRRecvFrom)仅是对POSIX标准sendto/recvfrom的简单封装。随着操作系统演进,现代系统已提供多报文API(如sendmmsg/recvmmsg)和分段卸载功能(如GSO/GRO),这些技术能显著提升UDP性能。

项目概述

2024年中启动的该项目旨在用Rust重写Firefox的QUIC UDP I/O栈,主要目标: 1. 通过内存安全语言提升安全性 2. 利用现代系统调用优化性能 3. 基于现有Rust实现的QUIC状态机保持兼容性

项目选择在quinn-udp库(Rust QUIC实现Quinn的底层组件)基础上开发,大幅加速了开发进程。经过一年努力,新方案已于2025年中向大多数Firefox用户推送。性能测试显示极端情况下吞吐量从不足1Gbit/s跃升至4Gbit/s。

技术原理

传统单报文模式

每发送/接收一个UDP报文都需要用户态/内核态切换,当传输速率达到500Mbit/s时,这种开销变得显著。

现代优化方案

  1. 批量处理:通过sendmmsg/recvmmsg单次处理多个报文,减少系统调用次数
  2. 分段卸载:应用发送超大报文(超过MTU),由内核或网卡自动分片,接收时反向聚合

平台适配挑战

Windows系统

  • 发现ARM64设备启用WSL时,URO(接收端卸载)功能存在段大小返回异常,导致页面加载失败
  • USO(发送端卸载)引发网络驱动崩溃,目前暂禁用这两项功能

macOS系统

  • 缺乏官方分段卸载支持
  • 实验性使用未公开的sendmsgx/recvmsgx批量API后,因稳定性顾虑未正式启用

Linux系统

  • 完整支持GSO/GRO和批量API
  • 由于Firefox采用每连接独立socket的设计,GSO的单一四元组限制反而成为优势

Android系统

  • x86架构需通过socketcall间接调用系统API
  • 旧版本(API≤25)设置ECN位会返回EINVAL错误
  • 默认seccomp过滤器导致直接调用高级socket API会触发崩溃

额外收获:显式拥塞通知(ECN)

新架构使Firefox能够支持ECN功能,目前夜间版50%的QUIC连接已具备ECN能力,为未来L4S部署奠定基础。

项目成果

成功实现: 1. 用内存安全的Rust代码替代传统实现 2. 全平台支持现代UDP系统调用 3. CPU密集型场景下吞吐量提升4倍 4. 全平台ECN支持

待完善工作包括Windows平台的USO/URO稳定性优化。随着QUIC普及,预计操作系统对UDP优化的支持将持续改进。

(全文共精简原始技术细节约30%,聚焦核心创新点和关键问题解决方案)

评论总结

以下是评论内容的总结:

  1. 关于问题复现的困难性

    • 观点:网络问题复现过程令人抓狂
    • 引用:
      "After many hours of back and forth... trying to reproduce issues" (jcranmer)
      "Glad to know that networking still produces insanity..." (jcranmer)
  2. 对Rust语言的调侃

    • 观点:Rust项目常在标题中自我标榜
    • 引用:
      "How do you know something is written in Rust? It’ll say so in the headline!" (nefarious_ends)
  3. 对"现代"网络技术的讨论

    • 观点:sendmmsg/recvmmsg不算新技术,期待看到io_uring的讨论
    • 引用:
      "It’s crazy that sendmmsg/recvmmsg are considered 'modern'..." (znpy)
      "I was expecting to see io_uring mentioned..." (znpy)
  4. 性能提升的肯定

    • 观点:UDP吞吐量提升400%的数据令人印象深刻,特别是对移动设备的能效改善
    • 引用:
      "400% increase in throughput... That's pretty cool" (metadat)
      "claims about transition... do not come with the data to back it up" (metadat)
  5. 跨平台网络技术的局限

    • 观点:Windows和MacOS的GSO/GRO等效技术存在缺陷
    • 引用:
      "unfortunate that they seem buggy" (Cloudef)

总结呈现了不同评论者的核心观点,包括技术复现的困难、语言特性调侃、技术新旧之争、性能数据认可,以及跨平台技术问题等多元视角。