软件性能检测--火焰图

火焰图是 svg 格式的矢量图,基于 perf 软件性能分析工具。通过对软件在系统上的工作行为记录进行采样。并将数据进行图形化,从而得出比较直观的可视化数据矢量图。

🔥 文章来源 《软件性能检测–火焰图🔥程》


1. perf 采样

  • 基于 Linux 平台的 perf 采样脚本(fg.sh - github 源码),对指定进程(pid)进行采样,生成火焰图 perf.svg
#!/bin/sh

if [ $# -lt 1 ]; then
    echo 'input pid'
    exit 1
fi

rm -f perf.*
perf record -F 99 -p $1 -g -- sleep 60
perf script -i perf.data &> perf.unfold
stackcollapse-perf.pl perf.unfold &> perf.folded
flamegraph.pl perf.folded > perf.svg

🔥 生成火焰图视频教程 《生成火焰图(Generate flame diagram)》


2. 火焰图

通过上面脚本,对指定进程(pid)进行数据采集,即可生成下面的二维火焰图:

  • Y 轴是函数块叠加而成,有点像程序调试堆栈;
  • X 轴代表程序函数,在单位时间内被采样的密集度。函数块越长,说明采样越多,工作频率越高,耗性能越多。

通过图象,我们对自己写的代码工作效率一目了然,这样可以针对性优化源码性能。

  • siege 压测工具。
# siege 压力测试工具
# $ ./http_pressure.sh

{
        "transactions":                        50000,
        "availability":                       100.00,
        "elapsed_time":                         1.62,
        "data_transferred":                     3.43,
        "response_time":                        0.00,
        "transaction_rate":                 30864.20,
        "throughput":                           2.12,
        "concurrency":                         46.59,
        "successful_transactions":             50000,
        "failed_transactions":                     0,
        "longest_transaction":                  0.01,
        "shortest_transaction":                 0.00
}
  • 火焰图🔥
    火焰图

3. 定位问题

上图可以看到 vsnprintf 在优化前使用频率非常高,占 6.7%。在源码中查找 vsnprintf,发现日志入口,对日志等级 level 的判断写在 log_raw 里面了,导致高等级的日志虽然没有被记录,仍然执行了 vsnprintf 操作。后面将判断放在 vsnprintf 前,重复进行测试,占 1.54%。 性能提高 5 个百分点——good!

bool Log::log_data(const char* file_name, int file_line, const char* func_name, int level, const char* fmt, ...) {
    if (level < LL_EMERG || level > LL_DEBUG || level > m_cur_level) {
        return false;
    }
    va_list ap;
    char msg[LOG_MAX_LEN] = {0};
    va_start(ap, fmt);
    vsnprintf(msg, sizeof(msg), fmt, ap);
    va_end(ap);
    return log_raw(file_name, file_line, func_name, level, msg);
}

4. 参考


如果文章不错,给个点赞呗 ~ 谢谢。👍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值