FEATURED · 精选文章

Windows 下使用 WPR 与 WPA 剖析 rustc 的内存与性能:从 ETL 录制到调用栈分析

发布时间 / 2026/9/12 18:11:28
来源 / 创域科博编辑部
栏目 / 资讯中心
Windows 下使用 WPR 与 WPA 剖析 rustc 的内存与性能:从 ETL 录制到调用栈分析 Windows 下使用 WPR 与 WPA 剖析 rustc 的内存与性能从 ETL 录制到调用栈分析【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust本指南面向 Windows 平台上需要深入分析 Rust 编译器rustc构建过程性能与内存开销的开发者。基于 rustc 开发指南中的《Profiling on Windows》章节本文完整覆盖 Windows Performance RecorderWPR与 Windows Performance AnalyzerWPA的安装、录制配置、符号加载与调用栈下钻全流程并结合本仓库的 bootstrap 配置源码解释debuginfo-level等关键参数的真实作用。读完本文你将能够自行录制一次 stage 2 rustc 构建、生成 ETL 事件追踪文件并在 WPA 中逐层定位内存分配的热点调用栈。为什么在 Windows 上剖析 rustc 需要 WPR 与 WPArustc 是高度复杂的编译器其构建过程会启动大量子进程rustc.exe、cargo.exe、link.exe 等内存占用可达数十 GB。在 Windows 平台上一套系统级的高层性能与内存分析工具组合是 WPRWindows Performance Recorder与 WPAWindows Performance AnalyzerWPR负责录制——以事件追踪日志Event Trace Log简称 ETL 文件的形式采集系统统计信息WPA负责分析——打开并解析 ETL 文件以表格、图表的形式呈现数据。需要特别注意的是WPR 采集的是系统级system wide统计它不只记录 rustc 相关的数据而是记录机器上运行的一切。这种全量采集的优点是后续可以任意过滤、只看我们关心的内容代价是 WPR/WPA 功能强大但有一定学习曲线——这正是本文要解决的问题。本文对应的原始文档位于 src/doc/rustc-dev-guide/src/profiling/wpa-profiling.md它是 rustc 开发指南中 profiling 章节的 Windows 专属部分同目录下还有针对 Linux 的 with-perf.md 与 with-rustc-perf.md可作对照阅读。安装 WPR 与 WPAWPR 与 WPA 随Windows Performance Toolkit一起提供而 Windows Performance Toolkit 是Windows Assessment and Deployment KitADK的一个可选组件。安装步骤如下下载 ADK 安装器Windows ADK 安装页面启动安装时务必勾选 Windows Performance Toolkit组件其余组件按需选择分析 rustc 并不需要它们。安装完成后即可从开始菜单启动 WPR用于录制和 WPA用于分析。录制前准备让 bootstrap 产出带符号的编译器为什么必须自行构建 stage 1 编译器进行内存分析时最佳实践是录制用带调试符号的 stage 1 编译器构建 stage 2 编译器这一过程。原因在于编译器二进制中的符号symbols能让 WPA 正确解析 Rust 栈帧把十六进制地址还原成rustc_driver::compile这样的可读函数名官方分发的stage 0 编译器默认没有开启符号没有调试信息直接用它录制会得到一堆无法解析的栈因此必须先用 stage 0 构建出带符号的stage 1 编译器再用它去构建 stage 2并在这一过程中录制。配置rust.debuginfo-level 1在仓库根目录的bootstrap.toml可从仓库根目录的 bootstrap.example.toml 复制得到中设置[rust] debuginfo-level 1该配置的含义在 bootstrap.example.toml 中有明确注释它对应 rustc 的-C debuginfoN选项控制大部分 Rust 代码的调试信息级别。debuginfo-level 1会让 rustc 在 bootstrap 时生成包含**栈帧stack frames**的调试信息这正是 WPA 解析调用栈所必需的。结合源码可以进一步理解该参数的底层实现配置项的解析入口在 src/bootstrap/configure.pydebuginfo-level与rust.debuginfo-level一一对应同时还有debuginfo-level-rustc、debuginfo-level-std、debuginfo-level-tools、debuginfo-level-tests等细分项分别覆盖编译器本体、标准库、工具与 compiletest 测试套件配置结构体定义在 src/bootstrap/src/core/config/toml/rust.rs 的Rust结构体中仓库默认的贡献者配置 src/bootstrap/defaults/bootstrap.compiler.toml 采用debuginfo-level line-tables-only注释明确说明这是从 backtrace、profiling 等场景获取真正有用信息的最小字节开销方案。关于取值需要留意0表示不生成调试信息bootstrap.example.toml 的默认行为是if rust.debug { 1 } else { 0 }即是否启用取决于rust.debug1生成行号级别的调试信息本文推荐值2会生成数 GB 的调试信息并显著拖慢链接过程bootstrap.example.toml 明确警告了这一点分析内存时没有必要用到此外bootstrap.example.toml 提到 compiletest 运行测试时的调试信息不受该选项控制需单独通过debuginfo-level-tests开启——不过那与本场景无关。构建 stage 1 编译器配置完成后构建带符号的 stage 1 编译器./x build --stage 1 -i library也可以按你自己的方式构建 stage 1 编译器。构建完成后stage 1 rustc 二进制就携带了可用于栈回溯的调试信息可以作为后续录制阶段的分析对象。录制用 WPR 捕获 stage 2 构建过程选择录制 Profile打开 WPR在窗口底部选择要录制的profiles即录制内容清单。针对 rustc bootstrap 进程的内存分析需要勾选CPU usageCPU 使用情况VirtualAlloc usage虚拟内存分配情况。文档特别提醒你可能想顺带勾选Heap usage堆使用但它会记录每一次堆分配开销非常非常大can be very, very expensive。对高层级的内存分析而言最好保持关闭。开始录制与停止录制流程如下回到 WPR点击Start按钮开始录制在终端中构建 stage 2 编译器./x build --stage2 -i library构建过程结束后回到 WPR 点击Stop停止录制。保存并导入 WPA停止录制后点击Save按钮保存 ETL 追踪文件保存完成后点击弹出的Open in WPA按钮将 ETL 文件交给 WPA 打开。注意追踪文件相当大系统级全量录制通常为数百 MB 到数 GBWPA 打开文件需要一定时间请耐心等待。分析在 WPA 中定位 rustc 的内存热点应用 rustc 专用 ProfileETL 文件在 WPA 中打开后首先要应用一个为 rustc bootstrap 分析专门预制的profile即用于调整 WPA 默认视图与图表布局的设置文件文件名为rustc.generic.wpaProfile可从文档指向的 rustc-bootstrap-wpa-analysis 项目发布页下载。应用方式点击顶部Profiles菜单 →Apply→ 选择下载的 profile 文件。应用后WPA 会呈现出为 rustc 内存分析预配置的视图大致如下图所示该视图中可以看到按进程Process Name聚合的内存面板以及Commit Stack、Commit Time、Size等关键列rustc.exe、cargo.exe等进程的内存占用一目了然。加载符号以还原 Rust 调用栈接下来需要让 WPA 加载并处理调试符号从而正确还原demangleRust 栈帧点击顶部Trace菜单选择Load Symbols加载符号。这一步可能需要花费较长时间要为 rustc 及其依赖加载大量 PDB/符号信息请耐心等待完成。加载成功后栈帧中的函数名才能以可读形式呈现。沿 Commit Stack 下钻到最大分配符号加载完成后就可以开始真正的追根溯源了在表格中找到rustc.exe节点并展开在Commit Stack提交栈列中展开[Root]节点持续逐层展开直到找到感兴趣的栈帧。一个非常实用的操作技巧选中要展开的节点后直接按键盘右箭头键→——它会展开该节点并把选中项自动移动到展开集合中下一个最大的节点。连续按右箭头即可沿着内存占用最大的路径一路下钻直达热点函数。下图是展开 Commit Stack 后的示例可以看到本段 profile 中经由 codegen 相关调用链的累计内存分配达到了约 30 GB从图中可以直观看到rustc_driver!compile等真实 Rust 函数帧出现在栈中——这正是前面加载符号、并为 stage 1 编译器开启debuginfo-level 1的回报栈是可读的而不是一堆地址。预置 Profile 中的其他分析标签页该 rustc 专用 profile 还包含若干开箱即用的分析标签页各自服务于不同的分析目的标签页用途System Configuration展示录制时所在系统的常规信息CPU、内存等环境参数用于确认录制环境。rustc Build Processesrustc.exe、cargo.exe、link.exe 等相关进程的扁平列表每个进程都带命令行参数可用于判断某个具体的 rustc 进程当时正在处理什么例如正在编译哪个 crate。rustc Build Process Tree以时间线形式展示各进程的启动与退出时刻适合观察构建阶段的并行度与依赖关系。rustc CPU Analysis预配置的图表用于展示 rustc 的时间消耗热点CPU hotspots辅助分析 rustc 把时间花在了哪里。rustc Memory Analysis预配置的图表用于展示 rustc 在哪里分配内存即本文主流程所使用的内存分析视图。这套进程清单 进程时间线 CPU 热点 内存热点的组合覆盖了从哪个进程在干什么到时间花在哪、内存花在哪的完整分析链条先用 Build Processes 缩小到具体 rustc 进程再用 Process Tree 看阶段分布最后用 CPU/Memory Analysis 定位热点函数。小结与实操核查清单完整复现本文流程的核查清单如下安装ADK → Windows Performance Toolkit仅此一项即可配置bootstrap.toml中设置[rust] debuginfo-level 1对应源码入口 src/bootstrap/configure.py、结构定义 src/bootstrap/src/core/config/toml/rust.rs构建 stage 1./x build --stage 1 -i library产出带符号编译器录制WPR 勾选 CPU usage 与 VirtualAlloc usage不要开 Heap usageStart 后执行./x build --stage2 -i libraryStop、Save分析WPA 打开 ETL → 应用rustc.generic.wpaProfile→ Trace → Load Symbols → 展开 Commit Stack 并沿右箭头下钻善用标签页System Configuration / rustc Build Processes / rustc Build Process Tree / rustc CPU Analysis / rustc Memory Analysis。通过这套流程你可以获得 rustc 在 Windows 上构建时的真实内存分配调用栈例如定位到 codegen 阶段数十 GB 级虚拟内存分配的具体来源函数从而为 rustc 的内存优化提供数据支撑。相关配置项的默认值、取值边界与警告信息均可在 bootstrap.example.toml 与 src/bootstrap/defaults/bootstrap.compiler.toml 中查到一手依据。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻