基本概念
Perf为性能分析工具,依赖PMU(Performance Monitoring Unit)对采样事件进行计数和上下文采集,统计出热点分布(hot spot)和热路径(hot path)。
运行机制
基于事件采样原理,以性能事件为基础,当事件发生时,相应的事件计数器溢出发生中断,在中断处理函数中记录事件信息,包括当前的pc、当前运行的任务ID以及调用栈等信息。
Perf提供2种工作模式,计数模式和采样模式。
计数模式仅统计事件发生的次数和耗时,采样模式会收集上下文数据到环形buffer中,需要IDE进行数据解析生成热点函数与热点路径。
接口说明
OpenHarmony LiteOS-A内核的Perf模块提供下面几种功能,接口详细信息可以查看 API 参考。
表1 Perf模块接口说明
功能分类 | 接口描述 |
---|---|
开启/停止Perf采样 | LOS_PerfInit : 初始化Perf LOS_PerfStart:开启采样 LOS_PerfStop:停止采样 |
配置Perf采样事件 | LOS_PerfConfig:配置采样事件的类型、周期等 |
读取采样数据 | LOS_PerfDataRead:读取采样数据到指定地址 |
注册采样数据缓冲区的钩子函数 | LOS_PerfNotifyHookReg:注册缓冲区水线到达的处理钩子 LOS_PerfFlushHookReg:注册缓冲区刷cache的钩子 |
-
Perf采样事件的结构体为PerfConfigAttr,详细字段含义及取值详见 kernel\include\los_perf.h 。
-
采样数据缓冲区为环形buffer,buffer中读过的区域可以覆盖写,未被读过的区域不能被覆盖写。
-
缓冲区有限,用户可通过注册水线到达的钩子进行buffer溢出提醒或buffer读操作。默认水线值为buffer总大小的1/2。 示例如下:
VOID Example_PerfNotifyHook(VOID)
{
CHAR buf[LOSCFG_PERF_BUFFER_SIZE] = {0};
UINT32 len;
PRINT_DEBUG("perf buffer reach the waterline!\n");
len = LOS_PerfDataRead(buf, LOSCFG_PERF_BUFFER_SIZE);
OsPrintBuff(buf, len); /* print data */
}
LOS_PerfNotifyHookReg(Example_PerfNotifyHook);
c
- 若perf采样的buffer涉及到CPU跨cache,则用户可通过注册刷cache的钩子,进行cache同步。 示例如下:
VOID Example_PerfFlushHook(VOID *addr, UINT32 size)
{
OsCacheFlush(addr, size); /* platform interface */
}
LOS_PerfNotifyHookReg(Example_PerfFlushHook);
c
刷cache接口视具体的平台自行配置。
开发指导
内核态开发流程
开启Perf调测的典型流程如下:
- 配置Perf模块相关宏。 配置Perf控制宏LOSCFG_KERNEL_PERF,默认关,在kernel/liteos_a目录下执行 make update_config命令配置"Kernel->Enable Perf Feature"中打开:
配置项 | menuconfig选项 |
---|