有个最简单的是用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()
- }
点击(此处)折叠或打开
-
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
