如题:
假设你已经熟悉了基本用法,知道perf是干嘛的,以及会用 perf top
[性能优化] perf
背景:目标程序在运行的某时间段内会出现性能下降,需要了解这个时间内,程序发生了什么。
方法:
1. 按时间轴记录下性能变化数据。
2. 同时记录下当时的perf数据,使用perf record
3. 按照时间轴进行对比,对特定时间段内的perf数据进行分析。使用perf report。
1. 因为perf data内目前不能记录wall clock time。所以需要保证同时启动(关闭)性能变化的记录程序和perf record。之后才能对应时间轴。
编译的时候最好加编译选项“” -O0 -ggdb“”
记录性能变化的脚本:(这个脚本是用来抽样检测性能数据的)
[root@vm perf-]# ../forward/forward.sh |tee perf.log
#! /bin/bash date
old_value=`/root/cli-client getPortStatus |awk -F '[=,]' '{if($12=="'\''all'\''") print $22}'`
old_date_value=`date +%s` while true :
do
sleep
value=`/root/cli-client getPortStatus |awk -F '[=,]' '{if($12=="'\''all'\''") print $22}'`
date_value=`date +%s`
conn_count=`/root/cli-client nlb_conn_count` x_value=`expr $value - $old_value`
x_date_value=`expr $date_value - $old_date_value` old_value=$value
old_date_value=$date_value output=`echo "scale=2; $x_value / $x_date_value" | bc -l`
echo -e "$date_value\t$output\t$conn_count"
done
perf record的用法:
对于多线程程序,找到要调试的线程id
[root@vm perf-]# top -n -H -p
运行perf:
T:保留时间戳。g:记录调用树。
[root@vmnlb perf-]# perf record -Tgs -t ,,,
perf record会在当前目录生成文件perf.data
查看时间轴: 可见: 时间为:79627到80301
[root@vm perf-]# perf script -i perf.data |head
lcore-slave- 79627.186181: cycles:
7fff8105ad5a native_write_msr_safe ([kernel.kallsyms])
7fff81032bfc intel_pmu_enable_all ([kernel.kallsyms])
7fff8102d284 x86_pmu_enable ([kernel.kallsyms])
7fff8115d4b7 perf_pmu_enable ([kernel.kallsyms])
7fff8102b459 x86_pmu_commit_txn ([kernel.kallsyms])
7fff8115e620 group_sched_in ([kernel.kallsyms])
7fff8115eabf __perf_event_enable ([kernel.kallsyms])
7fff81159be0 remote_function ([kernel.kallsyms])
7fff810e8a1d flush_smp_call_function_queue ([kernel.kallsyms])
[root@vmnlb perf-]# perf script -i perf.data |tail -n
lcore-slave- 80301.104199: cycles:
7fff8163ec99 _raw_spin_lock_irq ([kernel.kallsyms])
7fff810f236c acct_collect ([kernel.kallsyms])
7fff8108345f do_exit ([kernel.kallsyms])
分析对应了时间轴之后的,性能日志:(根据前文中的forward.sh作出的抽样数据,可以生成如下的频率图。)
使用 perf report:
--sort参数很重要,用来指定不同的统计维度,维度不同的时候,累计值也不同,所以如果选择了错误的维度,很可能忽略问题。
--no-children与--children是一对互逆的配置,可以影响统计排序,也很重要。参考:https://*.com/questions/31567272/sorting-by-self-column-in-perf-report?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
[root@vm perf-]# perf report --time ,
[root@vm perf-]# perf report --time , -s sym
[root@vm perf-]# perf report --time , -s sym --no-children