首页 > 编程语言 >c++ 性能分析

c++ 性能分析

时间:2023-03-09 13:13:56浏览次数:53  
标签:分析 lg perf 性能 c++ jeprof heap prof jemalloc

本文记录下日常工作中用到的性能分析工具。

一、内存泄漏排查

我的服务依赖了 jemalloc,这个地方记录下使用 jemalloc 进行内存分析的方法。

1 编译 jemalloc

首先,依赖的 jemalloc lib 需要开启 profiling 功能。

$ wget https://github.com/jemalloc/jemalloc/archive/5.2.1.tar.gz
$ tar xvf 5.2.1.tar.gz
$ cd jemalloc-5.2.1/
$ mkdir build; cd build
$ ../autogen.sh
$ ../configure --prefix=/path/to/build --enable-prof
$ make -j8

2 编译应用程序

3 设置 jemalloc 环境变量

在执行应用程序之前,需要设置好用于 jemalloc heap profiling 的环境变量。

$ export MALLOC_CONF=prof_leak:true,lg_prof_sample:19,prof:true,prof_prefix:jeprof.out,prof_final:true,lg_prof_interval:29

prof: bool类型,表示是否开启profiling。开启后,将会剖析程序的内存申请操作。而且只有开启,下面的参数才会生效。 官方文档:http://jemalloc.net/jemalloc.3.html#opt.prof

prof_leak: bool类型,是否开启profiling memory leak,默认是false,即disabled。开启后,将会在调用atexit(3)函数时生成memory leak报告。也就是程序结束时产出报告,但是一般服务型程序是不会主动退出的,如果使用kill将进程退出是不起作用的,所以对于服务型守护进程,使用lg_prof_interval间隔性产出内存剖析报告。 官方文档:http://jemalloc.net/jemalloc.3.html#opt.prof_leak

lg_prof_sample: size_t类型,分配样本之间的平均间隔,以分配活动的字节数衡量。增加采样间隔会降低配置文件的保真度,但也会降低计算开销。默认值是19,即默认的采样间隔是512 KiB (2^19 B)。这个参数不能设置太小,如果设置为0表明内存申请的采样精度是1字节,profiling机制也需要占用内存,设置为0程序可能很快就会OOM,而且极大影响程序性能。

上例中19表示采样精度是2^19 = 512KB
官方文档: http://jemalloc.net/jemalloc.3.html#opt.lg_prof_sample

prof_prefix: 产出heap剖析报告文件的前缀。注意可以是路径,比如 /tmp/jeprof.out
官方文档: http://jemalloc.net/jemalloc.3.html#opt.prof_prefix

prof_final: bool类型。

官方文档: http://jemalloc.net/jemalloc.3.html#opt.prof_final

lg_prof_interval: 内存剖析文件dump的平均间隔,以分配活动的字节数衡量。剖析文件落盘的文件名格式:...i.heap,其中是由opt.prof_prefix选项控制。默认情况下,区间触发的配置文件转储被禁用(编码为-1)

上例中29表示大约每隔申请2^29=512MB的内存时,dump一次剖析文件。

官方文档: http://jemalloc.net/jemalloc.3.html#opt.lg_prof_interval

4 运行应用程序

5 产生报告

运行应用程序后,会在本地生成一些 heap profile 文件。在第一步编译 jemalloc 时,产出了一个 jeprof 工具,用来生成报告。
首先安装绘图工具依赖:

yum install graphviz
yum install ghostscript

第二步 将 heap 文件转换为 pdf 格式:

$ jeprof --show_bytes 应用程序 -pdf jeprof.out.9579.0.i0.heap > 0.pdf

或者比较两次dump的差异

$ jeprof --show_bytes 应用程序 -pdf --base jeprof.out.9579.0.i0.heap   jeprof.out.8429.1.i1.heap > 0.pdf

二、cpu 分析

基于 linux perf dump 程序数据,并生成火焰图查看。

1 找到要分析的进程 id

2 使用 perf 收集信息

perf record -a -g -F99 -p 进程id sleep 60

3 生成火焰图

使用 perf script 将 perf.data 转为可读数据

perf script > perf.script

使用 FlameGraph 生成火焰图

./FlameGraph/stackcollapse-perf.pl perf.script | ./FlameGraph/flamegraph.pl > report.svg

三、函数性能分析

使用 perf top 可以查看某个进程的耗时百分比分布,从而知道哪些函数比较耗时:

server_name="xsearch_leaf_kdweibocrawler"
pid=`pidof $server_name`
echo $pid
perf top -p $pid

打印函数调用链的性能占比

perf record -F 99 -p ${pid} --call-graph dwarf sleep ${采样时间}

执行perf report可以看到各个子函数性能占比。

标签:分析,lg,perf,性能,c++,jeprof,heap,prof,jemalloc
From: https://www.cnblogs.com/xianzhedeyu/p/17197973.html

相关文章

  • 性能测试-ulimit命令说明与用法-强相关u和n参数-修改后得重启程序
    1、ulimit命令与显示说明ulimit是一种Linux系统的内建功能,它具有一套参数集,用于为由它生成的shell进程及其所创进程的资源使用限制。-a:显示目前资源限制的设定;-c......
  • cpu、内存问题排查——gperftools 性能测试工具介绍
      在阅读reids源码时发现redis在自身内存管理malloc/frees的时候使用到tcmalloc,google后发现此组件竟然出自google开源的gperftools性能分析工具集,然后发现许多大虾云......
  • 01、为什么要用大数据技术进行安全分析?
    转载公众号《微言晓意》,仅用于个人学习关于安全运营系列文章,在2020年10月份写了篇《安全运营的定义与核心目标》,算是开了个头。后面几个月由于精力不够,内容方向也没有想清......
  • 02、大数据安全分析技术框架与关键技术
    转载公众号《微言晓意》,仅用于个人学习大数据分析通过对安全告警、系统日志以及网络流量等海量多源异构数据进行采集、存储与分析,打破原有网络安全烟囱式防护模式,将所有安......
  • 10、安全告警关联相关安全分析场景
    转载公众号《微言晓意》,仅用于个人学习安全告警关联分析归纳起来可以分为四类:1、同一攻击源/目的特定告警数量叠加,可能遭受持续性攻击;2、内网主机发起安全攻击,可能主机已......
  • K8S 性能优化 - 大型集群 CIDR 配置
    前言K8S性能优化系列文章,本文为第三篇:Kubernetes大型集群CIDR配置最佳实践。系列文章:《K8S性能优化-OSsysctl调优》《K8S性能优化-K8SAPIServer调优》......
  • 03、关联分析简介
    大数据关联分析提供了基于规则、基于统计的关联分析功能,能够实现对于安全事件的误报排除、事件源推论、安全事件级别重新定义等效能。▼▼关联分析简介关联分析是在大规模......
  • 高并发时发生的性能问题
    最近线上系统高并发时发生了两次性能问题,总结了一下共享给大家,避免日后再发生此类问题。1.现象:redis服务器cpu负荷很高,响应慢原因:代码中使用keys命令查询导致redis整体扫......
  • 06、攻击链在大数据安全分析中的应用
    攻击链由攻击流程与防御概念构成。攻击流程分为侦察目标、制作工具、传递工具、触发工具、安装设置、命令与控制、目标达成等七个阶段。这七个阶段详细介绍如下:1、侦察目......
  • 架构师是如何进行前端性能优化设计的 All In One
    架构师是如何进行前端性能优化设计的AllInOne做为一名架构师应该如何对前端项目性能优化方案进行设计和落地执行性能优化设计模式/优化策率/投入产出比/性价比量化......