最近一段时间火焰图(flamegraph,)越来越火,特别是在性能分析,基本成了标配的工具,最近在定位lustre的性能问题,以前一直用自己改的基于ftrace的perf-tool(),但是老板说要用Flamegraph展示,悲催的是Flamegraph暂时不支持ftrace。
有个最简单的是用perf record到处事件记录,直接用flamegraph来生成svg,可是...可是...lustre没有嵌入trace event...哭笑不得...没办法,只能用systemtap来probe lustre模块中的函数,其实原理是一样的,只不过trace event是提前插入了钩子,systemtap是后来插入钩子,下面是个简单的stp脚本,用模糊语法自动匹配模块里面的函数进行probe,存到聚合数组里面,最后统一打印。
-
global lustre_func
-
-
probe module("lnet").function("*") {
-
lustre_func[backtrace()] <<< 1
-
}
-
-
-
probe timer.s(20) {
-
foreach ([sys] in lustre_func) {
-
print_stack(sys)
-
printf("\t%d\n", @count(lustre_func[sys]))
-
}
-
exit()
-
}
导出systemtap的记录,然后转换成flamegraph能识别的,最后生成svg火焰图
-
stap --ldd --all-modules -D MAXMAPENTRIES=256 -D MAXACTION=20000 -D MAXTRACE=100 -D MAXSTRINGLEN=4096 -D MAXBACKTRACE=100 -x 2082 lnet.stap>a.out
-
perl stackcollapse-stap.pl a.out > a.out2
-
perl flamegraph.pl a.out2 > a.svg
看下简单的效果图:
阅读(1070) | 评论(0) | 转发(0) |