如何将Bash脚本性能日志转为perf格式生成火焰图?
分析Bash脚本性能并生成火焰图的解决方案
1. 转换日志为火焰图兼容格式
你的日志已经包含调用栈深度(加号数量)、绝对时间戳和执行命令,只需计算每个命令的耗时并整理出调用栈结构:
日志处理脚本
创建process_trace.awk脚本:
BEGIN { prev_time = 0 } { # 提取调用栈深度、时间戳、命令内容 depth = match($0, /^\++/); time = substr($0, depth+1, index($0, " ") - depth -1); cmd = substr($0, index($0, " ") + 2); # 计算耗时并输出调用栈+耗时格式 if (prev_time != 0) { duration = time - prev_time; # 维护调用栈:按深度更新栈元素 stack[depth] = cmd; # 拼接完整调用栈(用分号分隔层级) full_stack = ""; for (i=1; i<=depth; i++) { full_stack = full_stack (full_stack ? ";" : "") stack[i]; } printf("%s %.6f\n", full_stack, duration); } prev_time = time; }
将你的日志保存为bash_trace.log,执行处理:
awk -f process_trace.awk bash_trace.log > flamegraph_data.txt
2. 生成火焰图
使用火焰图工具生成可视化图表:
- 获取工具脚本:
git clone https://github.com/brendangregg/FlameGraph.git
- 生成SVG火焰图:
./FlameGraph/stackcollapse.pl flamegraph_data.txt | ./FlameGraph/flamegraph.pl > bash_script_perf.svg
打开bash_script_perf.svg即可直观查看各调用栈的耗时占比,快速定位性能瓶颈。
核心逻辑说明
- 调用栈维护:通过加号数量确定当前命令的调用深度,动态更新栈数组,确保层级关系准确。
- 耗时计算:利用相邻命令的绝对时间差,得到单条命令的执行耗时。
- 火焰图解读:横向长度代表耗时占比,纵向为调用栈深度,点击节点可展开查看子调用的细节。
内容的提问来源于stack exchange,提问作者Ciprian Tomoiagă
相关产品推荐
相关产品推荐

