之前详细的介绍了perfetto抓取日志的办法,这些办法都会获得一个pftrace的文件,我们只需要将这个文件在https://ui.perfetto.dev 加载即可显示。本文介绍可视化UI的一些基础使用办法

默认界面如上,我们只需要点击 Open trace file 将perfetto/tracebox抓到的日志上传上去即可
以调度轨迹为例的一张视图如下,我们先看CPU Scheduling 这行,这是sched_switch的事件,代表整个系统上的调度情况。这些sched_switch的事件的组成就是 CPU 调度全景图

可以看到这里有16个核心,从粗的角度来看,CPU6,7,8,2,10,14,5几个CPU上运行的任务事件比较密集,我们大概知道当前系统环境的性能状态
Ftrace Events代表者ftrace提供的信息,这是原始ftrace ring buffer的信息,因为这份日志抓的是调度轨迹,所以我们只看到了sched_wakeup(蓝色)和sched_switch(黄色)的信息,也就是任务什么时候被唤醒,什么时候切换

Scheduler行提供了调度的关键指标的折线图显示如下

当前有多少线程处于R状态,因为Linux不区分runable和running的状态标记,所以这是 所有 CPU 上正在跑的线程 + 等待被调度的就绪队列线程。
在我这个例子里面,可以看到当前调度状态非常空闲,因为max是1
这是影响调度的关键指标,不可中断线程就是D状态的线程,也就是正在等待 I/O、磁盘、网络等不可中断的操作
通常为 磁盘IO/网络IO/锁
在这个例子里面,可以看到我后台有多个claude在运行,所以max是3,这个3大概率全是磁盘IO状态的线程
所谓活跃的cpu计数,其实就是非 idle 的 CPU 核心数,在统计的时候非常简单,就是总CPU减去swapper即可
在我这个例子里面,max是14,说明这段时间最大调动了14个cpu工作,但绝大部分情况下是0,说明系统非常空闲
这是 记录 trace 中不同data source 的时钟基准

我们之前提过,perfetto是生产者消费者模型,那么生产者可以多个,也就意味着时钟源也是多个,但是我们想要的是系统性分析性能问题,perfetto做了时钟同步规则,就是通过 Clock Snapshots 来实现
例如:
通过 Clock Snapshots 中的对照关系,Perfetto 可以换算成统一的时间轴进行对比。
在我这个例子里面,是记录了BOOTTIME,perfetto默认支持如下几类事件
当然,也支持自定义的时间戳统一, 如果 trace 配置了 allow_all_kernel_clocks: true,Perfetto 会自动把不同数据源的时间转换到同一个时钟基准。
简单来说,我们不需要担心时间不统一的情况,perfetto ui 内部做好了对齐
通过sdk内嵌到程序代码的slice也可以一并查看,下面是自定义data source(实际复用了perfetto原生 trace event)的信息,每个长条都是一个slice块

perfetto会抓取单一视角的调度状态,分为runable和running状态,下图是以claude本身的调度情况

如果我们放大,可以看到进程的详细状态信息,例如什么时刻出现了 Uninterruptible Sleep

如果我们点击空白处,就是进程sleep的时间

| 快捷键 | 功能 | 说明 |
|---|---|---|
W | 放大 | 沿时间轴放大 |
S | 缩小 | 沿时间轴缩小 |
A | 左移 | 向左平移时间线 |
D | 右移 | 向右平移时间线 |
Shift + 拖拽 | 鼠标平移 | 按住 Shift 拖拽平移 |
Ctrl + 滚轮 | 鼠标缩放 | 滚轮放大缩小 |
| 快捷键 | 功能 | 说明 |
|---|---|---|
| 点击 | 选择事件 | 点击 slice 查看详情 |
. | 下一个 slice | 跳到同一轨道的下一个事件 |
, | 上一个 slice | 跳到同一轨道的上一个事件 |
F | 聚焦选中事件 | 将选中事件居中显示;再按 F 适配视口 |
R | 转为面积选择 | 将当前选中事件转为面积选择 |
Escape | 清除选择 | 取消所有选择 |
上面都是简单粗略的查看了系统的性能状态,下面简单介绍一下如何初步分析
如果我点击任意的进程内的slice,可以详细的看到这个进程此时的信息,如下
点击任意 slice,底部 "Current Selection" 标签显示:

对于ftrace,可以获取ftrace的原始数据信息,这对调试内核的同学来说应该再熟悉不过了

直接鼠标在上面拉框就可以看到一段区域的统计信息,如果当前模式不在选择模式,可以使用快捷键R转到面积选择

我选中了前7个核的2.68s时间,可以看到下面的统计 snap 在这7个核心上运行了87ms,平均运行时间是378.9us
如果我们要看整个声明周期的,按下ctrl+a可以统计,我们统计claude进程的进程状态如下

可以看到claude运行了353us,sleep了14.68ms,runable状态是34.17us。可以看到系统非常空闲
Perfetto的精髓在于能够sql查询,这里先简单的演示如何快速sql。我们直接在顶部输入栏输入
: select * from slice
这会查找所有的slice

可以看到快速的找到了我自定义程序的slice片段
根据上面描述的信息,我可以统计所有的running状态
: select * from thread_state where state like "%running%"
现在可以自定义一个Track proc_sum,如下

通过这个track可以获取到所有cpu的running状态的统计,如下

我们可以选择一个比较密集的状态,查看哪些cpu在运行,如下

本文详细介绍了perfetto ui的使用办法,掌握这些技巧就可以初步的看到系统的性能状态,接下来详细介绍SQL进行trace分析