使用Simpleperf进行性能分析
Simpleperf是一款命令行原生CPU性能分析工具,可帮助您分析应用程序在Vega设备上的性能。使用Simpleperf可以识别CPU瓶颈、过多上下文切换、低效线程调度,以及仅通过代码审查可能无法发现的其他性能问题。该工具能够深入洞察内核之间的CPU使用模式、函数调用频率和执行时间、硬件性能计数器、进程调度行为和上下文切换模式等方面。
Simpleperf有两种工作模式:
- 设备端模式 — 通过监控正在运行的应用程序和系统活动来收集实时性能数据。
- 主机端模式 — 处理并展示先前在设备上收集的数据。
当您的应用程序出现意外掉帧、电池消耗太快、响应迟缓时,或怀疑CPU使用率高于预期时,可使用Simpleperf。
何时使用Simpleperf
| 场景 | 推荐工具 |
|---|---|
| 通过图形界面进行实时CPU与内存监控 | Activity Monitor |
| 获取硬件计数器数据、调用图,或不使用Vega Studio即进行性能分析 | Simpleperf |
| 分析JavaScript线程性能并生成火焰图 | Chrome DevTools |
| 在开发过程中快速目视检查CPU峰值 | Activity Monitor |
| 对应用启动流程或特定原生代码路径进行性能分析 | Simpleperf |
先决条件
在开始之前,请确保:
- 已安装Vega SDK
- 已通过VDA连接Fire TV Stick设备
- 您的应用程序已在此设备上构建并运行
设置Simpleperf
默认情况下,设备镜像中不包含Simpleperf。你需要将二进制文件从Vega SDK侧载到设备上。
步骤1: 验证您的构建变体
确认您的设备使用用户外部版本或用户构建变体。两种版本都适用于Simpleperf,但用户外部版本更为常见:
vda shell "cat /etc/os-release | grep BUILD_VARIANT"
预期输出:
BUILD_VARIANT=user-external
或者
BUILD_VARIANT=user
步骤2: 启用开发者模式
在设备上启用开发者模式:
vda shell vsm developer-mode enable
有关开发者模式的更多详细信息,请参阅启用开发者模式。
步骤3: 连接到您的设备并启动您的应用程序
打开与您的设备的shell连接:
vda shell
使用vmsgr启动您的应用程序。例如:
vmsgr send "pkg://com.amazondeveloper.mytestapp.main"
步骤4: 将Simpleperf二进制文件推送到设备
在SDK中找到Simpleperf二进制文件,位置为:
vega/workspace/env/KeplerCLISimpleperf-1.0/runtime/simpleperf-target/simpleperf
将该文件推送到应用程序的临时文件夹:
vda push vega/workspace/env/KeplerCLISimpleperf-1.0/runtime/simpleperf-target/simpleperf tmp/scratch/com.amazondeveloper.mytestapp
输出示例:
developer@bcd07467961e ~ % vda push vega/workspace/env/KeplerCLISimpleperf-1.0/runtime/simpleperf-target/simpleperf /tmp/scratch/com.amazondeveloper.mytestapp
simpleperf: 1 file pushed, 0 skipped.0.1 MB/s (130 bytes in 0.001s)
该二进制文件现在可以在组件shell的tmp/scratch文件夹中找到。
步骤5: 访问组件shell
在您的主机上打开一个新终端。您需要另一个单独终端窗口,因为此时您的第一个终端正在运行步骤3中的vda shell会话。
连接到组件shell:
vda shell -t component-id com.amazondeveloper.mytestapp.main
导航到您将二进制文件推送到的scratch目录:
cd /scratch
现在,您可从这个目录运行Simpleperf命令。
查找您的应用程序的进程ID
在进行性能分析之前,请找到应用程序的进程ID (PID):
ps -A
输出示例:
PID TTY TIME CMD
2 ? 00:00:22 mytestapp
66 pts/1 00:00:00 sh
76 pts/1 00:00:00 ps
您可以通过PID、应用程序ID或pidof来指定您的应用程序:
./simpleperf stat -p 2 # By PID
./simpleperf stat -p com.amazondeveloper.mytestapp # By app ID
./simpleperf stat -p $(pidof com.amazondeveloper.mytestapp) # By pidof
列出可用事件
使用Simpleperf list命令查看您的设备支持哪些事件:
# List all available events
simpleperf list
# List hardware events only
simpleperf list hw
# List software events only
simpleperf list sw
其他筛选选项包括:
cache— 硬件缓存事件raw— 原始CPU PMU事件tracepoint— 追踪点事件cs-etm— CoreSight ETM指令跟踪事件pmu— 特定于系统的PMU事件
要查看设备支持的功能:
simpleperf list --show-features
硬件事件输出示例:
硬件事件列表:
cpu-cycles (硬件事件)
instructions (硬件事件)
cache-references (硬件事件)
cache-misses (硬件事件)
branch-instructions (硬件事件)
branch-misses (硬件事件)
软件事件输出示例:
软件事件列表:
cpu-clock (软件事件)
task-clock (软件事件)
page-faults (软件事件)
context-switches (软件事件)
cpu-migrations (软件事件)
minor-faults (软件事件)
在运行simpleperf stat和simpleperf record命令时,可使用-e选项指定上述任意事件。
使用stat功能收集性能统计数据
simpleperf stat收集CPU事件的聚合性能统计信息。此模式可提供硬件和软件事件的简要摘要,且不会产生详细采样数据带来的额外开销,适用于快速性能评估以及优化效果的A/B测试。
# 对特定进程进行基础stat数据收集
simpleperf stat -p <pid>
# 使用指定事件进行stat收集
simpleperf stat -e cache-misses,branch-misses -p <pid>
# 使用自定义打印间隔进行stat收集(每1000毫秒一次)
simpleperf stat --interval 1000 -p <pid>
# 仅收集内核空间的stat数据
simpleperf stat -e cpu-cycles:k -p <pid>
# 使用事件分组进行stat收集
simpleperf stat -e cpu-cycles,instructions -p <pid>
# 设置固定持续时长(10秒)进行stat收集
simpleperf stat -p <pid> --duration 10
输出示例:
性能计数器统计信息:
1,320,496,145 cpu-cycles # 0.131736 GHz (100%)
510,426,028 instructions # 每条指令2.587047个周期 (100%)
4,692,338 branch-misses # 468.118 K/sec (100%)
886.008130(ms) task-clock # 0.088390个cpu占用 (100%)
753 context-switches # 75.121 /秒 (100%)
870 page-faults # 86.793 /秒 (100%)
总测试时间: 10.023829 秒。
simpleperf stat-a)仅在root权限下可用。解读stat结果
请参考以下说明来解读输出:
| 指标 | 含义 | 数据高时的应对操作 |
|---|---|---|
cpu-cycles |
CPU执行的总工作量 | 使用record进行性能分析,查找热点函数 |
instructions / 每条指令周期数 |
CPU执行效率 | 低IPC(每条指令周期数>3)表明存在内存停顿或分支预测错误 |
branch-misses |
分支预测失败 | 简化条件逻辑或重构数据,以获得可预测的访问模式 |
context-switches |
线程抢占频率 | 减少线程数或将工作整合到更少的线程上 |
page-faults |
从磁盘加载的内存页面 | 预分配内存或减少工作集大小 |
cache-misses |
CPU缓存效率低下 | 改善数据局部性、减少对象分配或重构数据布局 |
要查看所有可用选项,请运行simpleperf help stat。
记录详细性能数据
使用simpleperf record,通过按预定义的时间间隔对CPU事件进行采样,收集深度的CPU性能指标。Simpleperf将所有记录的数据存储在perf.data文件中,以供后续分析。
事件的作用域仅限于监控用户空间(:u)或仅限于内核监控内核空间(:k)。对于大多数Vega应用程序的性能分析,请使用用户空间监控。
# 基本记录
simpleperf record -p <pid>
# 使用调用图进行记录(推荐用于详细分析)
simpleperf record -e cpu-cycles:u --call-graph dwarf,2048 -p <pid> -- sleep 10
# 记录特定事件
simpleperf record -e cache-misses,branch-misses -p <pid>
# 以更高采样频率进行记录(1000个样本/秒)
simpleperf record -f 1000 -p <pid>
# 记录指定线程
simpleperf record -t <thread_id> -p <pid>
# 记录内核空间事件
simpleperf record -e cpu-cycles:k -p <pid>
# 记录到自定义输出文件
simpleperf record -o custom_output.data -p <pid>
simpleperf record -a)仅在root权限下可用。要查看所有可用选项,请运行simpleperf help record。
将性能数据传输到您的主机
组件shell会将性能数据文件存储在/scratch目录中。要检索这些文件,请在主机上(组件shell之外)打开一个终端,并运行:
vda pull /tmp/scratch/com.amazondeveloper.mytestapp/perf.data
/scratch目录可能会被清除。如果你希望性能数据在应用启动和设备重启后依然保留,请在拉取数据前先将数据文件复制到 /data目录。使用报告分析性能数据
在你的主机上使用simpleperf report命令来分析收集到的perf.data文件。请使用SDK中提供的主机版Simpleperf,其路径为:
vega/sdk/<version>/bin/tools/simpleperf
请将<version>替换为你已安装的SDK版本号(例如0.23.6323)。
# 生成基础报告(在当前目录中查找perf.data文件)
simpleperf report
# 使用调用图生成报告(必须使用-g标志记录数据)
simpleperf report -g
# 从指定文件生成报告
simpleperf report -i perf.data
# 自定义排序方式
simpleperf report --sort comm,pid,tid,dso,symbol
# 按进程筛选
simpleperf report --pids <pid1>,<pid2>
# 按线程筛选
simpleperf report --tids <tid1>,<tid2>
# 按二进制文件筛选
simpleperf report --dsos <path_to_binary>
输出示例:
Cmdline: /usr/bin/simpleperf record -e cpu-clock -p 1171 --duration 10
架构:x86_64
事件:cpu-clock(类型1,配置0)
示例: 1
事件数: 250000
开销 命令 Pid Tid 共享目标 符号
100.00% ..pdate-daem:36 1171 2937 /lib/libc.so.6 __errno_location
要查看所有可用选项,请运行simpleperf help report。
其他命令
Simpleperf包含另外一些用于特殊性能分析需求的命令:
| 命令 | 描述 |
|---|---|
debug-unwind |
测试并调试离线堆栈回溯功能 |
dump |
从perf.data文件中提取并显示原始数据 |
inject |
修改现有perf.data文件或向其注入数据 |
kmem |
分析内核内存分配模式(需要root权限) |
merge |
将多个perf.data文件合并为一个 |
monitor |
实时监控事件,并将文本形式的输出打印到标准输出 |
report-sample |
显示perf.data文件中的原始采样信息 |
trace-sched |
跟踪系统范围的进程运行时事件(需要root权限) |
要查看所有子命令及其选项:
simpleperf --help
已知限制
Simpleperf依赖perf_event_paranoid内核参数来确定其操作权限。默认情况下,Vega OS将此值设置为2,这会出于安全原因而限制某些分析功能。
对于启用了user-external构建变体版本和开发者模式的设备,系统会自动将该项设定值调整为1,从而可以进行更全面的分析。但是,非特权用户仍然受到以下限制:
- 无法分析内核空间事件
- 无法访问硬件PMU事件
- 无法分析其他用户的进程
- 无法收集原始跟踪点事件
- 无法访问内核调用图
- 无法收集内核模态堆栈跟踪
最佳实践
数据收集
- 务必指定持续时间,或使用受控终止。
- 使用适当的采样频率。
- 在性能分析期间注意观察系统负载。
事件选择
- 从基本事件(
cpu-cycles、instructions)开始。 - 避免同时监控过多的硬件事件。
- 考虑目标设备的硬件限制。
报告分析
- 比较多次运行结果,确保结果的一致性。
- 使用适当的筛选条件来缩小结果范围。
- 务必检查是否有丢失的采样。
资源管理
- 清理旧的
perf.data文件,释放设备存储空间。 - 通过限制采样频率,来控制CPU开销。
示例: 诊断滚动时的掉帧情况
本演练介绍如何使用Simpleperf来调查应用程序在滚动浏览内容列表时丢帧的问题。
1.使用stat确认问题:
./simpleperf stat -e cpu-cycles,cache-misses,context-switches -p $(pidof com.amazondeveloper.mytestapp) --duration 5
如果你发现context-switches次数过高(>500次/秒),或者cache-misses次数相对于cpu-cycles数偏高,则很可能存在值得调查的性能问题。
2.在有问题的交互期间记录调用图:
./simpleperf record -e cpu-cycles:u --call-graph dwarf,2048 -p $(pidof com.amazondeveloper.mytestapp) -- sleep 10
在10秒的记录窗口内,滚动浏览内容列表。
3.提取数据并在主机上进行分析:
vda pull /tmp/scratch/com.amazondeveloper.mytestapp/perf.data
simpleperf report -g -i perf.data --sort comm,pid,tid,dso,symbol
4.确定瓶颈所在:
查找Overhead占比较高的函数。例如:
35.2% mytestapp 2 2 libhermes.so hermes::vm::interpretFunction
22.1% mytestapp 2 2 libreact.so facebook::react::ShadowTree::commit
这表明35%的CPU时间花在了Hermes JavaScript的执行上,22%的时间花在React的影子树提交上。你的滚动处理程序可能在每帧中执行了太多的JS工作。
5.修复并验证:
优化后(例如,在滚动处理程序中存储昂贵的计算结果),重新运行相同的stat命令,确认各指标有所改善。
相关主题
Last updated: 2026年6月18日

