as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
Ring
AWS
文档
Support
Contact Us
My Cases
新手入门
设计和开发
应用发布
参考
支持

使用Simpleperf进行性能分析

使用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 statsimpleperf 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 秒。

解读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 help record

将性能数据传输到您的主机

组件shell会将性能数据文件存储在/scratch目录中。要检索这些文件,请在主机上(组件shell之外)打开一个终端,并运行:

vda pull /tmp/scratch/com.amazondeveloper.mytestapp/perf.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-cyclesinstructions)开始。
  • 避免同时监控过多的硬件事件。
  • 考虑目标设备的硬件限制。

报告分析

  • 比较多次运行结果,确保结果的一致性。
  • 使用适当的筛选条件来缩小结果范围。
  • 务必检查是否有丢失的采样。

资源管理

  • 清理旧的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日