亚马逊资助下的FreeBSD年度技术总结
自2010年首次在亚马逊EC2平台启动FreeBSD以来,我一直负责该平台的维护工作。2023年11月,我新增了FreeBSD发布工程负责人的角色——恰逢FreeBSD 14.0发布,虽然该版本的实际发布工作由Glen Barber完成。尽管获得Antithesis和FreeBSD/EC2 Patreon的少量资助,但很快发现发布工程职责正在挤占我用于FreeBSD/EC2开发的志愿时间:不仅长期的功能开发清单陷入停滞,对异常现象的调查也经常被迫推迟。到2024年初,我越来越担忧自己无法胜任FreeBSD/EC2平台"所有者"的角色。
经过多年断断续续的协商,2024年4月终于与亚马逊达成通过GitHub Sponsors提供一年资助的协议。亚马逊名义上资助我每月40小时用于FreeBSD发布工程和EC2开发(实际投入约50小时/月),其中20小时专用于EC2问题,20小时用于版本发布,10小时处理其他发布工程事务。
版本发布管理
按照我在2024年5月BSDCan开发者峰会上制定的季度发布计划,过去一年共管理四个版本发布:
- FreeBSD 13.4(2024年9月)
- FreeBSD 14.2(2024年12月)
- FreeBSD 13.5(2025年3月)
- FreeBSD 14.3(计划2025年6月10日)
每个版本的发布工作集中在"Beta月"(每季度第二个月),耗时从33.5小时(13.5版本)到79小时(14.2版本)不等。稳定分支后期的发布工作量显著降低,预计FreeBSD 15.0的发布将超过100小时。
EC2平台关键技术突破
Graviton电源驱动开发
在Graviton系统上,通过解析ACPI _AEI对象确定GPIO引脚配置,将其传递给PL061 GPIO控制器驱动。当该引脚被触发时,控制器生成中断引发ACPI"电源按钮"事件。值得注意的是,EC2提供的ACPI表中错误指定了"Pull Up"配置,而PL061控制器实际不具备上拉电阻。为此我们在FreeBSD/EC2 AMI中新增了ACPI_Q_AEI_NOPULL特性标志。
设备热插拔支持
热卸载功能的实现面临多个实例类型的特定问题:
- Graviton系统IRQ泄漏:通过引导加载程序设置禁用传统PCI中断路由代码
- PCI电源状态误判:新增ACPI_Q_CLEAR_PME_ON_DETACH特性在设备分离前清除电源管理寄存器
- NVMe驱动崩溃:由nvme驱动维护者修复
- PCI总线"幽灵设备":因Nitro固件异步操作导致,通过ACPI_Q_DELAY_BEFORE_EJECT_RESCAN特性增加10ms延迟
我们还优化了PCIe热插拔超时机制,在EC2环境下将默认5秒等待缩短为0,并开发了可连续300次插拔测试的验证脚本。
启动性能深度优化
通过分析2018年以来的启动数据(启动超过1万个EC2实例),发现并解决了多个关键问题:
- 根磁盘大小影响:将磁盘从6GB扩容到8GB解决性能下降问题
- Graviton 2熵种子问题:
- 修复EFI熵种子请求在EC2中的执行路径
- 重构熵池初始化逻辑,使用PBKDF2将64字节扩展为2048字节
- 使arm64/UFS镜像启动时间从25秒降至8秒
- ZFS性能问题:通过调整makefs事务组记录,将启动时间从22秒降至11秒
- IMDSv2 IPv6支持缺陷:修正连接优先级和超时设置
系统镜像生态扩展
新增两种AMI类型:
- small镜像:移除调试符号等非必要组件,体积从5GB降至1GB
- builder镜像:提供定制化FreeBSD AMI的构建环境
同时优化镜像管理,清理了336TB历史EBS快照。
发布工程体系改进
- 并行构建系统:通过修复Makefile目录创建依赖,将发布构建时间从22小时缩短至13小时
- 构建可重现性:利用EC2实例进行差异分析(diffoscope),发现并修复多个构建一致性问题
未来展望
随着资助期结束,FreeBSD 15.0及后续版本的发布将继续推进,但EC2平台的功能开发(如EBS卷自动扩容、网络接口热插拔支持等)可能放缓。这一年的资助使FreeBSD在云平台的支持达到新高度,相关技术成果将持续惠及整个开源社区。
(原文发布于2025-06-06,经技术内容提取和结构化处理)