基于systemtap+Flamegraph的可视化内核模块性能分析

1130阅读 0评论2018-08-21 cengku
分类:LINUX

最近一段时间火焰图(flamegraph,)越来越火,特别是在性能分析,基本成了标配的工具,最近在定位lustre的性能问题,以前一直用自己改的基于ftrace的perf-tool(),但是老板说要用Flamegraph展示,悲催的是Flamegraph暂时不支持ftrace。
有个最简单的是用perf record到处事件记录,直接用flamegraph来生成svg,可是...可是...lustre没有嵌入trace event...哭笑不得...没办法,只能用systemtap来probe lustre模块中的函数,其实原理是一样的,只不过trace event是提前插入了钩子,systemtap是后来插入钩子,下面是个简单的stp脚本,用模糊语法自动匹配模块里面的函数进行probe,存到聚合数组里面,最后统一打印。

点击(此处)折叠或打开

  1. global lustre_func

  2. probe module("lnet").function("*") {
  3.     lustre_func[backtrace()] <<< 1
  4. }


  5. probe timer.s(20) {
  6.     foreach ([sys] in lustre_func) {
  7.         print_stack(sys)
  8.         printf("\t%d\n", @count(lustre_func[sys]))
  9.     }
  10.     exit()
  11. }
导出systemtap的记录,然后转换成flamegraph能识别的,最后生成svg火焰图

点击(此处)折叠或打开

  1. 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
  2. perl stackcollapse-stap.pl a.out > a.out2
  3. perl flamegraph.pl a.out2 > a.svg
看下简单的效果图:



上一篇:Bcache浅析
下一篇:ZFS磁盘格式(1)