程序性能分析

程序性能分析

CPU及内存占用

参考https://github.com/astrofrog/psrecord

安装及使用

bash 复制代码
# pip install psrecord
ps -ef | grep *** # get psid 497354 可以换成htop查看
psrecord 497354 --plot psrecord_wo_imu.png --interval 0.5 --include-children

程序耗时火焰图分析

perf arm端安装及使用

arm端安装

安装参考https://zhuanlan.zhihu.com/p/446319798

perf 下载

bash 复制代码
sudo apt install linux-tools-common linux-tools-generic linux-tools-`uname -r`

这时可以使用perf -v查看是否安装成功

如果报错

bash 复制代码
WARNING: perf not found for kernel **4.15.0-48**

You may need to install the following packages for this specific kernel:
linux-tools-4.15.0-48-generic
linux-cloud-tools-4.15.0-48-generic

You may also want to install one of the following packages to keep up to date:
linux-tools-generic
linux-cloud-tools-generic

apt install linux-tools-generic
apt install linux-cloud-tools-generic

首先查看arm侧内核版本

bash 复制代码
uname -a

apt install 可安装版本中没有对应内核版本的ubuntu源码

因此在国内镜像网站https://mirrors.edge.kernel.org/pub/linux/kernel/ 找到对应内核版本的源码进行下载

将内核源码下载到本地,同时需要安装依赖

bash 复制代码
sudo apt install flex bison zlib1g zlib1g-dev libelf-dev elfutils systemtap-sdt-dev libssl-dev libunwind-dev libdw-dev libcap-dev libzstd-dev binutils-dev libiberty-dev lib-static-dev libslang2-dev libunwind-dev libperl-dev libnuma-dev libbabeltrace-dev libbabeltrace-ctf-dev python-dev-is-python3 python2 python2-dev

依赖安装之后

bash 复制代码
cd linux-5.10.16/tools/perf
make -j4 && make install #(-j 参与编译核心数)
cp ./perf /usr/bin

perf使用

perf 采集数据
bash 复制代码
perf record -a -p 3887 -g -- sleep 30

perf record 表示采集系统事件, 没有使用 -e 指定采集事件, 则默认采集 cycles(即 CPU clock 周期), -F 99 表示每秒 99 次, -p 13204 是进程号, 即对哪个进程进行分析, -g 表示记录调用栈, sleep 30 则是持续 30 秒. -a 表示对所有cpu采样

-F 指定采样频率为 99Hz(每秒99次), 如果 99次 都返回同一个函数名, 那就说明 CPU 这一秒钟都在执行同一个函数, 可能存在性能问题.

运行后会产生一个庞大的文本文件. 如果一台服务器有 16 个 CPU, 每秒抽样 99 次, 持续 30 秒, 就得到 47,520 个调用栈, 长达几十万甚至上百万行.

为了便于阅读, perf record 命令可以统计每个调用栈出现的百分比, 然后从高到低排列.

bash 复制代码
perf report -n --stdio
生成火焰图

Flame Graph下载

bash 复制代码
git clone https://github.com/brendangregg/FlameGraph.git
  1. 首先用 perf script 工具对 perf.data 进行解析
bash 复制代码
#生成折叠后的调用栈
perf script -i perf.data &> perf.unfold
  1. 然后将解析出来的信息存下来, 供生成火焰图

stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠 :

bash 复制代码
# 生成火焰图
./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
  1. 最后生成 svg 图

perf.svg

bash 复制代码
./FlameGraph/flamegraph.pl perf.folded > perf.svg

我们可以使用管道将上面的流程简化为一条命令

bash 复制代码
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > process.svg
  1. 解析火焰图

最后就可以用浏览器打开火焰图进行分析啦.

火焰图生成与分析参考:https://zhuanlan.zhihu.com/p/402188023

自动分析脚本:

bash 复制代码
#通过htop查看程序对应的进程号PID 在这里输入
read -p "process :" process
perf record -a -p $process -g -- sleep 30
perf script -i perf.data &> perf.unfold
./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
./FlameGraph/flamegraph.pl perf.folded > perf.svg
相关推荐
晴空了无痕1 天前
游戏客户端架构设计与实战:从模块化到性能优化
游戏·性能优化
谢尔登1 天前
【React】React 性能优化
前端·react.js·性能优化
我爱松子鱼1 天前
mysql之InnoDB Buffer Pool 深度解析与性能优化
android·mysql·性能优化
weixin_425878231 天前
Redis复制性能优化利器:深入解析replica-lazy-flush参数
数据库·redis·性能优化
奔跑吧邓邓子1 天前
【Python爬虫(36)】深挖多进程爬虫性能优化:从通信到负载均衡
开发语言·爬虫·python·性能优化·负载均衡·多进程
web135085886351 天前
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
jmeter·中间件·性能优化
程序员远仔2 天前
【Vue.js 和 React.js 的主要区别是什么?】
前端·javascript·css·vue.js·react.js·性能优化·html5
敢嗣先锋3 天前
鸿蒙5.0实战案例:基于ArkUI启动冷启动过程最大连续丢帧数问题分析思路&案例
性能优化·移动开发·多线程·harmonyos·arkui·鸿蒙开发
小塵3 天前
【MySQL 优化】什么是回表?什么是索引覆盖?
后端·mysql·性能优化
拥有一颗学徒的心3 天前
鸿蒙第三方库MMKV源码学习笔记
笔记·学习·性能优化·harmonyos