Node.js 在 macOS 上的启动性能退化问题分析

Node.js 在 macOS 上的启动性能退化问题分析

performance Node.js team focusing on performance performance 项目地址: https://gitcode.com/gh_mirrors/performan/performance

问题背景

近期 Node.js 社区发现,在 macOS 特别是 ARM64 架构的设备上,从 Node.js 22 版本开始出现了明显的启动性能退化现象。这个问题在 Linux 系统上并不明显,但在 macOS 上表现得尤为突出,引起了开发者们的关注。

性能测试数据

通过基准测试可以清晰地看到这一退化现象:

  • Node.js 18: 平均 20.4ms
  • Node.js 20: 平均 20.7ms
  • Node.js 21: 平均 32.3ms
  • Node.js 22: 平均 34.3ms-36.5ms
  • Node.js 23: 平均 38.1ms

从 Node.js 18 到 Node.js 23,启动时间几乎翻倍。特别值得注意的是,这种退化主要出现在 macOS ARM64 设备上,而在 Linux x86_64 系统上,Node.js 的启动时间实际上是逐步优化的。

问题定位

通过火焰图分析和性能测试对比,开发者们将问题范围缩小到了几个关键区域:

  1. InitializeOncePerProcessInternal 函数

    • 在快速版本中占 22% 时间
    • 在慢速版本中占 30% 时间
    • 主要开销来自 OpenSSL 初始化和 cppgc 初始化
  2. NodeMainInstance 构造函数

    • 在两种版本中都占约 26% 时间
    • 主要开销来自 V8 快照初始化
  3. NodeMainInstance::Run 方法

    • 在快速版本中占 40% 时间
    • 在慢速版本中占 28% 时间

深入分析

OpenSSL 的影响

测试发现,禁用 OpenSSL 后性能有所改善:

  • 官方 Node.js 22.11.0: 35.3ms
  • 本地构建带 SSL: 30.4ms
  • 本地构建不带 SSL: 26.9ms

虽然 OpenSSL 确实带来了一定开销,但这并不能完全解释从 Node.js 20 到 Node.js 22 的全部性能退化。

V8 引擎升级的影响

从 V8 11.3 升级到 V8 11.8 是性能退化的一个重要分水岭。测试表明,即使将主函数改为空操作,这种退化仍然存在,说明问题出在全局初始化阶段。

平台特异性问题

这个问题在 macOS ARM64 上特别明显,而在 Linux x86_64 上几乎不可见。这表明问题可能与:

  1. macOS 的动态链接和重定位机制
  2. ARM64 架构特有的性能特性
  3. 特定编译器在 macOS 上的优化行为

可能的解决方案方向

  1. 优化 OpenSSL 初始化

    • 延迟加载 SSL 相关功能
    • 简化 SSL 初始化流程
  2. 改进 V8 快照处理

    • 分析快照大小和加载时间的增长
    • 优化快照反序列化过程
  3. 平台特定优化

    • 针对 macOS ARM64 进行特别优化
    • 调整编译器和链接器选项
  4. 启动流程重构

    • 将非关键路径初始化延迟执行
    • 并行化初始化过程

结论

Node.js 在 macOS ARM64 平台上的启动性能退化是一个复杂的问题,涉及多个子系统的交互。虽然 OpenSSL 初始化和 V8 升级是主要因素,但平台特定的动态链接和内存访问模式也可能起到了关键作用。解决这个问题需要综合考虑这些因素,并进行有针对性的优化。

对于性能敏感的应用,目前建议暂时停留在 Node.js 20 版本,等待后续版本对此问题的修复。开发者社区正在积极研究这一问题,相信未来会有进一步的优化方案出现。

performance Node.js team focusing on performance performance 项目地址: https://gitcode.com/gh_mirrors/performan/performance

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓克淼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值