性能分析过程
前提条件
- 服务器和操作系统正常运行。
- PC端已经安装SSH远程登录工具。
- 目标环境上鲲鹏DevKit系统性能分析工具已经安装完成,并正常运行。
操作步骤
函数实现的功能为多个线程对一个变量进行累加操作。实践使用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 任务配置参数说明 参数
说明
分析对象
应用
分析类型
热点函数分析
应用路径
/opt/testdemo/pthread_mutex
采样时长
30秒
采样间隔
1秒
采样频率
100次/秒
采样范围
用户态
- 查看分析结果。图1 总览
可以看到实际的两个线程对应的功能函数时钟周期占比很小,主要热点在Glibc对应的互斥锁上面。
- 执行锁与等待分析任务。
表2 任务配置参数说明 参数
说明
分析类型
锁与等待分析
分析对象
应用
模式
Attach to process
PID
选择pthread_mutex应用对应的进程号
锁分析类型
全选
预定义锁类型
默认
采样时长
20秒
采集原数据最大大小
1024MiB
分析栈
关闭
- 查看分析结果。图2 锁与等待分析结果
可以看到对应锁的调用情况,以及对应功能函数里的源码,对于变量num进行累加操作前后需要使用互斥锁,保证多个线程的操作均被执行到。但是应用的实际效率是很低的,过多的开销花费在了互斥锁的require和release上面。
父主题: 实践4:锁性能调优