linux火焰图的生成

安装依赖:

yum -y install perl --nogpgcheck
yum -y install perf.x86_64 --nogpgcheck
git clone https://github.com/brendangregg/FlameGraph.git

将FlameGraph加入PATH:
 

echo "export PATH=`pwd`/FlameGraph:\$PATH" > /etc/profile.d/perf.sh
#或
cp -r `pwd`/FlameGraph/* /usr/local/bin/
echo $PATH | grep '/usr/local/bin' || export PATH=$PATH:/usr/local/bin

录制函数调用取样数据:

perf record  -e cpu-clock -F 每秒取样频次 -p 进程ID -g -- sleep 取样秒数
也可以根据进程名
perf record  -e cpu-clock -F 每秒取样频次 -p `ps aux | grep '进程名' | grep -v 'grep' | awk '{print $2}'` -g -- sleep 取样秒数
如果是多线程程序可以指定录制的线程ID
perf record  -e cpu-clock -F 每秒取样频次 -p 线程ID -g -- sleep 取样秒数

生成On-CPU火焰图:

得到采样数据perf.data后再进行以下步骤:
perf script -i perf.data &> perf.unfold
stackcollapse-perf.pl perf.unfold &> perf.folded
flamegraph.pl perf.folded > perf.svg

将perf.svg用浏览器打开。

整理成脚本如下:

perf-record.sh

#/bin/sh
  
if [ "$1" == "" ]; then
    echo “usage: $0 prog_name”
    exit
fi
echo prog_name:$1
echo pid:`ps aux | grep $1 | grep -v 'grep' | grep -v 'perf-record' | grep -v 'gdb' | awk '{print $2}'`
perf record -F 10000 -p `ps aux | grep $1 | grep -v 'grep' | grep -v 'perf-record' | grep -v 'gdb' | awk '{print $2}'` -g -- sleep 60
perf script -i perf.data &> perf.unfold
stackcollapse-perf.pl perf.unfold &> perf.folded
flamegraph.pl perf.folded > oncpu.svg

也可以通过perf命令实时查看top函数:

perf-top.sh

#/bin/sh
  
if [ "$1" == "" ]; then
    echo “usage: $0 prog_name”
    exit
fi
echo prog_name:$1
echo pid:`ps aux | grep $1 | grep -v 'grep' | grep -v 'perf-top' | grep -v 'gdb' | awk '{print $2}'`
perf top -g -F 10000 -p `ps aux | grep $1 | grep -v 'grep' | grep -v 'perf-top' | grep -v 'gdb' | awk '{print $2}'`

生成Off-CPU火焰图:

以centos8为例,安装依赖:

yum install kernel-debug kernel-debug-devel --nogpgcheck
echo 1 > /proc/sys/kernel/sched_schedstats

生成off-cpu脚本:

perf-offcpu.sh

#/bin/sh
  
if [ "$1" == "" ]; then
    echo “usage: $0 prog_name”
    exit
fi
pid=`ps aux | grep $1 | grep -v 'grep' | grep -v 'perf-offcpu' | awk '{print $2}'`
echo prog_name:$1
echo pid:$pid
perf record -e sched:sched_stat_sleep -e sched:sched_switch \
    -e sched:sched_stat_iowait -e sched:sched_process_exit \
    -e sched:sched_stat_blocked -e sched:sched_stat_wait \
    -g -o perf.data.raw -p $pid -- sleep 30
perf inject -v -s -i perf.data.raw -o perf.data
perf script -F comm,pid,tid,cpu,time,period,event,ip,sym,dso,trace | awk '
    NF > 4 { exec = $1; period_ms = int($5 / 1000000) }
    NF > 1 && NF <= 4 && period_ms > 0 { print $2 }
    NF < 2 && period_ms > 0 { printf "%s\n%d\n\n", exec, period_ms }' | \
    stackcollapse.pl | \
    flamegraph.pl --countname=ms --title="Off-CPU Time Flame Graph" --colors=io > offcpu.svg

遇到的问题:

ERROR: No stack counts found

或者是权限问题,或者是采样率太低,可以更换root权限或提高采样率试试。

perf的采用率默认有上限,需要root权限修改系统配置:

临时修改:

echo 0 > /proc/sys/kernel/perf_cpu_time_max_percent

echo 10000 > /proc/sys/kernel/perf_event_max_sample_rate

持久修改:

root权限编辑 /etc/sysctl.conf 文件,添加:

kernel.perf_event_paranoid = -1
kernel.perf_cpu_time_max_percent = 0

然后执行 sysctl -p,立刻生效。

--end--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值