跳到主要内容

StarryOS 性能剖析

cargo xtask starry perf 构建 StarryOS 并通过 qperf 进行性能剖析,输出火焰图(SVG/HTML/Folded)、Pprof 或 callchain 数据。这是 StarryOS 独有的命令,ArceOSAxvisor 没有。

目前支持 riscv64loongarch64x86_64。x86_64 使用 StarryOS 的 q35/UEFI 启动配置,并通过 Ostool 的固定版本和 SHA-256 校验流程复用公共 OVMF 缓存。需要隔离缓存时, 统一设置 TGOS_OVMF_DIR;该目录必须使用 Ostool 的 <arch>/code.fdvars.fd 布局。 建议在 x86_64 上同时使用 --kernel-filter,排除 UEFI 固件和用户态地址。

1. 剖析流程

剖析流程先构建 qperf 工具链和 StarryOS 内核,再运行 QEMU 采样并生成报告。

2. 参数

perf 参数覆盖采样配置、guest 工作负载、host 侧统计和符号化输出。

参数说明
-c/--case <NAME>性能测试用例名(默认 boot
--arch <ARCH>目标架构:riscv64/loongarch64/x86_64(默认 riscv64
--freq <HZ>采样频率(默认 99)
--format输出格式:Folded/Svg/Pprof/All(默认 All
--mode采样模式:Tb(trace buffer,默认)/ Insn(指令级)
--max-depth <N>最大调用栈深度(默认 128)
--timeout <SEC>采集超时(默认 20)
--output-dir/--out <DIR>输出根目录,报告位于 <DIR>/perf/<arch>/latest
--host-time/--no-host-time收集/禁用 QEMU 进程的 host CPU 时间
--host-perf在 host 侧用 perf stat 采集 QEMU 进程指标
--host-perf-eventshost perf stat 事件(逗号分隔)
--shell-init-cmd/--workloadGuest shell 出现 boot 提示后发送的命令
--shell-prefix发送 --shell-init-cmd 前匹配的提示子串
--start-marker/--stop-markerGuest stdout 标记,控制采样窗口起止
--workload-timeout <SEC>采样窗口超时,超时则停止 QEMU
--qperf-metrics启用 feature-gated 的 in-guest qperf 指标计数
--flamegraph即使 --format 非 SVG 也生成火焰图
--flamegraph-kind火焰图格式:Svg(默认)/Html/Folded
--full-stack保留本构建可采集的最深栈
--perf-callchain(别名 --callchainqperf callchain 模式:Leaf/Fp/Logical
--perf-debuginfo添加 DWARF 调试信息并保留符号
--perf-force-frame-pointers强制帧指针以支持 FP 解栈
--demangle在 qperf-analyzer 中强制 Rust demangle
--no-truncate火焰图中保留极小帧(min width 设为 0)
--include-kernel-symbols包含内核符号(StarryOS 默认开启)
--include-user-symbols包含用户符号
--symbol-style折叠栈符号风格:Full(默认)/Short/Module
--focus <REGEX>为匹配正则的帧生成额外的聚焦折叠栈/火焰图
--kernel-filter仅保留内核态帧
--smp <N>CPU 核数
--debugdebug 构建

3. 采样模式

采样模式决定 qperf 从 trace buffer 读取样本,还是按指令级事件收集样本。

模式说明
Tb(trace buffer,默认)从 qperf 的内核 trace buffer 读取采样,开销低
Insn(指令级)指令级采样,精度高但开销大

4. Callchain 解栈模式

Callchain 模式决定 analyzer 如何从采样点恢复调用栈。

模式说明
Leaf最快,仅依赖采样点的 PC/LR
Fp需要帧指针(配合 --perf-force-frame-pointers
Logical逻辑推导,最完整但最慢

5. 输出产物

报告位于 <output-dir>/perf/<arch>/latest/,包含:

  • 火焰图(.svg / .html
  • 折叠栈(.folded
  • 原始采样(qperf.bin
  • 符号化统计(resolve_statsstack_depth_summary
  • phase/focus 火焰图(按采样窗口分段)
  • report.md/report.json 汇总报告与 hotspots.csv

6. 用法示例

以下示例覆盖默认采样、带采样窗口的 x86_64 boot 剖析、指令级采样和自定义工作负载。

# 默认 riscv64 性能剖析(boot 用例)
cargo xtask starry perf

# x86_64 内核 boot 剖析:出现 shell 后写入结束标记并停止 QEMU
cargo xtask starry perf --arch x86_64 --kernel-filter --format folded \
--shell-init-cmd "echo QPERF_BOOT_DONE" \
--stop-marker "QPERF_BOOT_DONE" --timeout 60

# 指令级采样 + 帧指针解栈
cargo xtask starry perf --mode insn --perf-callchain fp --perf-force-frame-pointers

# 自定义工作负载采样窗口
cargo xtask starry perf --shell-init-cmd "/bin/run_benchmark.sh" \
--start-marker "BENCH_START" --stop-marker "BENCH_END" \
--workload-timeout 30