优化 Ruby 路径方法:Bootsnap 性能提升 2 倍,Ruby 4.1 将推新功能!

张开发
2026/4/20 1:35:15 15 分钟阅读

分享文章

优化 Ruby 路径方法:Bootsnap 性能提升 2 倍,Ruby 4.1 将推新功能!
优化 Ruby 路径方法2026 年 4 月 18 日消息去年 11 月作者开始在 Intercom 担任新工作参与的第一个项目是和新同事一起优化 Intercom 单体应用的 CI。CI 性能和用户体验的关键驱动因素是让 Ruby 进程准备好运行测试的速度。并行测试的问题处理大测试套件时并行运行测试很重要。假设一个测试套件需 1 小时运行完理论上4 个工作进程 15 分钟完成10 个工作进程 6 分钟完成60 个工作进程 1 分钟完成。但实际没这么简单CI 测试运行器有两个阶段设置阶段和运行测试阶段。以 1 小时的测试套件为例加上 1 分钟设置阶段4 个工作进程需 16 分钟60 个并行工作进程需 2 分钟。这不仅带来糟糕用户体验还增加成本。并行化测试套件收益会递减减少工作进程设置时间能提升用户体验和降低成本。Intercom 单体应用的 CI 默认用 1350 个并行工作进程从设置时间中优化 1 秒效果比从特定测试中优化 1 秒高出 1350 倍每次构建可节省超 20 分钟计算时间。所以作者专注于减少设置时间。Bootsnap 的作用作者研究加快应用程序启动时间提到了 Bootsnap。虽然 Bootsnap 近十年来是 Rails 默认 gemfile 一部分在非 Rails 代码库也受欢迎但很多人可能不清楚其具体作用。当使用 require 加载文件时Ruby 要在加载路径中进行耗时的线性搜索扩展性差。新 Ruby 进程启动时加载路径约有八 个路径require 成本相对低。但每次向 gemfile 中添加 gem启动 Ruby 程序成本不是线性增加而是更高。Aaron Patterson 在 2015 年 GORUCO 演讲中解释了这个问题启发作者编写了 bootscale后来同事 Burke Libbey 重新实现该想法诞生了 bootsnap。Bootsnap 的工作原理加载路径缓存Bootsnap 主要特性是加载路径缓存。它提前扫描 $LOAD_PATH 中的所有目录构建包含所有可能被加载文件的大型映射通过 O(1) 的哈希查找定位文件。它会对 Kernel.require 进行装饰将相对路径转换为绝对路径避开 Ruby 缓慢的搜索机制。有了这个缓存每次调用 require 时无需扫描和检查多达 2*N 个文件的存在性只需支付一次性成本。缓存失效添加缓存后要知道何时缓存不再有效。Bootsnap 不能在 CI 构建之间持久化其缓存因为加载路径中文件的添加或删除会使缓存失效。Bootsnap 在缓存中记录扫描目录的 mtime当目录中文件添加或删除时该目录的 mtime 会更新但父目录的 mtime 不变。Bootsnap 重新验证缓存时需递归检查所有加载路径中目录的 mtime成本较高。在 CI 系统中git 检出代码不关心 mtime缓存无法在不同构建或机器之间复用每次都需重建所以扫描性能很重要。N1 系统调用在 Intercom 的单体仓库中扫描所有加载路径时间接近 1 秒。作者想找到改进方法分析了 Bootsnap 加载路径扫描器的简化实现。该路径扫描器类似 Web 编程中的 N1 查询问题是系统调用问题。系统调用涉及内核上下文切换应避免或减少。虽然 Ruby 内部使用 d_type 加速 Dir[] 等方法但未将其暴露给 Dir.foreach 块。作者早在 2020 年就研究加速 Bootsnap 和 Zeitwerk 的问题提交了关于 Dir.scan 方法的功能请求但未得到回应。实现 Dir.scan作者决定从头开始尝试扩展现有的 Dir 方法让它们返回表示文件类型的符号作为第二个参数。初始原型将递归遍历目录的速度提高了约 2 倍。中田信義Nobuyoshi Nakada实现了一个替代版本返回 File::Stat 对象。作者提交了新的功能请求提议使用他的 API。作者认为即使获批该功能也要到 Ruby 4.1 才能实现。于是作者直接在 Bootsnap 中实现这个 API在 Intercom 单体应用上进行基准测试速度同样提高了 2 倍。后来作者的 Ruby 功能请求在开发者会议上讨论提出了向后兼容性问题。最终确定了新方法 Dir.scan该功能将在 Ruby 4.1.0 中可用。其他路径方法虽然 N1 问题是主要性能瓶颈2 倍的性能提升不错但作者认为未优化的代码可能存在类似问题。Bootsnap 经常调用的 File.join 方法虽不是主要瓶颈但在启动分析中明显值得研究。判断代码是否比应有的速度慢可将简单实现与真正的方法进行基准测试了解还有多少性能可提升。

更多文章