性能分析过程
前提条件
- 服务器和操作系统正常运行。
- PC端已经安装SSH远程登录工具。
- 目标环境上鲲鹏DevKit系统性能分析工具已经安装完成,并正常运行。
- 目标环境上已安装GCC 7.3.0。
操作步骤
函数实现的功能为多个线程对一个变量进行累加操作。实践使用demo请参考testdemo。
使用demo需注意以下几点:
- demo要求GCC版本在7.3及以上,低版本的GCC编译pthread_atomic.c会报错。
- 若使用的GCC版本为10.x.x及以上,因该版本默认启用LSE指令集,可能优化效果不明显,建议编译程序时添加参数“-march=armv8-a+nolse -mno-outline-atomics”用以禁用该指令集。
- 若需要关联源码,建议编译时加上-g参数;同时对编译后的二进制文件检查(可使用file pthread_mutex)是否存在BuildID,若不存在建议加上-Wl,--build-id参数。如:gcc -g -Wl,--build-id pthread_mutex.c -o pthread_mutex -lpthread 。
- 使用热点函数分析任务查看锁热点时,任务开启的同时后台需运行对应的demo,否则无法采集到锁的热点。
- 更多demo详情请查看demo说明(readme)。
- 新建热点函数分析任务。
单击系统性能分析后面的
,选择“通用分析”,打开新建任务页面,选择“热点函数分析”,参数配置完成后单击“确认”启动热点函数分析任务。未特别说明的参数请使用默认值。图1 新建热点函数分析任务
表1 任务配置参数说明 参数
说明
分析类型
热点函数分析。
分析对象
应用。
应用路径
/opt/testdemo/pthread_mutex。
采样时长
30秒。
采样间隔
1秒。
采样频率
100次/秒。
采样范围
用户态。
dwarf
开启。
C/C++ 源文件目录
用于采集过程时关联源码。本示例使用/opt/testdemo/。
- 查看分析结果。图2 总览
可以看到实际的两个线程对应的功能函数时钟周期占比很小,主要热点在Glibc对应的互斥锁上面。
- 新建锁与等待分析任务。
单击系统性能分析后面的
,选择“通用分析”,打开新建任务页面,选择“锁与等待分析”,参数配置完成后单击“确认”启动锁与等待分析任务。未特别说明的参数请使用默认值。图3 新建锁与等待分析任务
表2 任务配置参数说明 参数
说明
分析类型
锁与等待分析。
分析对象
应用。
模式
Attach to process。
PID
选择pthread_mutex应用对应的进程号。
锁分析类型
全选(勾选“直方图统计”和“锁实例分析”)。
预定义锁类型
默认。
采样时长
60秒。
采集原数据最大大小
1024MiB。
分析栈
关闭。
- 查看分析结果。图4 锁与等待分析结果
可以看到对应锁的调用情况,以及对应功能函数里的源码,对于变量num进行累加操作前后需要使用互斥锁,保证多个线程的操作均被执行到。但是应用的实际效率是很低的,过多的开销花费在了互斥锁的require和release上面。
父主题: 实践2:锁性能调优