Google Perftools简介与使用

使用 perf-tools 检查 glusterfs 内存泄漏问题 二次开发 glusterfs,执行几个命令的时候发现有内存泄漏的问题,一开始使用的是 valgrind 来进行检查,很快检查到两个地方,其中一个有完善的 stack,但是剩下一个只有简单的一个栈:根本没有办法解决,只好借助更加精细的内存检查工具 perf-tools 进行检查。 阅读详情

转自:http://blog.youkuaiyun.com/turkeyzhou/article/details/8794188


一. 安装与简介 

    从主页http://code.google.com/p/google-perftools/downloads/list下载源码包,解压后使用命令序列./configure;make;make install安装。如果make报错,请使用./configure --enable-frame-pointers从新来过。默认安装路径为/usr/local/,头文件和库文件分别在/usr/local/inlcude/google/和/usr/local/lib/下。需要设置环境变量export LD_LIBRARAY_PATH=/usr/local/lib。跟valgrind的profiler工具的不同之处是,Google perftools使用在源程序中插入profiler代码的方式,而不是valgrind的虚拟机方式,所以Google perftools以库文件的形式提供了一系列函数接口。为了使用图形化结果还需要安装gv,可使用apt-get安装:sudo apt-get install gv。 

    Google Perftools包括三个工具(注:包括tcmalloc应该是4个),三个工具均支持多线程程序,以下分别介绍。 

 

Google Perftools简介与使用 

 朱泓丞  2009-08-07 

一. 安装与简介 

    从主页http://code.google.com/p/google-perftools/downloads/list下载源码包,解压后使用命令序列./configure;make;make install安装。如果make报错,请使用./configure --enable-frame-pointers从新来过。默认安装路径为/usr/local/,头文件和库文件分别在/usr/local/inlcude/google/和/usr/local/lib/下。需要设置环境变量export LD_LIBRARAY_PATH=/usr/local/lib。跟valgrind的profiler工具的不同之处是,Google perftools使用在源程序中插入profiler代码的方式,而不是valgrind的虚拟机方式,所以Google perftools以库文件的形式提供了一系列函数接口。为了使用图形化结果还需要安装gv,可使用apt-get安装:sudo apt-get install gv。 

    Google Perftools包括三个工具,三个工具均支持多线程程序,以下分别介绍。 

二. CPU profiler 

    通过cpu中断采样的方式来统计每个函数被采样的次数,占总采样次数的百分比,调用的子函数的被采样次数等。通过这些信息来找到程序的cpu性能瓶颈,从而有针对性的进行优化。

    在要检测的程序的源文件中包含头文件google/profiler.h(默认全路径为/usr/local/include),并在需要统计的代码段前后调用函数ProfilerStop(char*)和ProfilerStop(),其中ProfilerStart的参数是输出profile的文件路径。注意,可以对多个代码段作profile,但是如果使用同样的输出文件,后一次 profile的输出会完全覆盖前一次的输出。然后编译源程序并使用-lprofiler连接选项得到链接了cpu profiler代码的可执行程序,这里推荐使用-O0编译选项,否则可能无法得到函数调用关系图。以后每次运行可执行程序,都会生成 profile输出文件,输出文件是人不可识别的二进制文件。CPU profiler采样的频率是可调的,设置环境变量CPUPROFILE_FREQUENCY来确定每秒钟的采样次数,默认为100。 

    输出的profile文件可以用工具pprof(一个perl程序)来方便的生成各种人可读的形式。下面以一个随机生成1000000个整数插入一个红黑树中的程序来演示ppro的使用,可执行程序名为RBtree,生成的profile文件名为RBTree.prof,作profile的代码段主要调用了RBTree::insert,RBtree::insertFixup和rand等函数。 

    pprof的使用形式都是: pprof --option [ --focus=<regexp> ] [ --ignore=<regexp> ] [--line or addresses or functions] 可执行文件路径  对应的profile路径。方括号中的项目是可选项目。<regexp>表示正则表达式。 

    option可取的值有:text,gv,dot,ps,pdf,gif,list=<regexp>,disasm=<regexp>。表示不同的输出形式。其中list=<regexp>表示输出匹配正则表达式的函数的源代码,diasm=<regexp>表示输出匹配正则表达式的函数的反汇编代码。text是字符统计输出形式,其它的对应不同的图形文件格式。 

    --focus=<regexp>表示只统计函数名匹配正则表达式的函数的采样,--ignore=<regexp>表示不统计函数名匹配正则表达式的函数的采样。 

    [--line or addresses or functions]表示生成的统计是基于代码行,指令地址还是函数的,默认是函数。

    pprof --text ./RBtree ./RBtree.prof 生成的字符统计结果如下。 

         501  62.2%  62.2%      714  88.6% RBTree::insert
          84  10.4%  72.6%       84  10.4% RBTree::defaultCmp
          80   9.9%  82.5%      154  19.1% RBTree::nodeCmp
          61   7.6%  90.1%       73   9.1% RBTree::insertFixup
          47   5.8%  95.9%       47   5.8% malloc_trim
           9   1.1%  97.0%      746  92.6% main
           6    0.7%  97.8%        6   0.7% RBTree::rightRotate
           6   0.7%  98.5%        6   0.7% RBTree::leftRotate
           5   0.6%  99.1%        5   0.6% malloc
           3   0.4%  99.5%        3   0.4% operator new
           3   0.4%  99.9%        3   0.4% random_r
           1   0.1% 100.0%        1   0.1% rand
           0   0.0% 100.0%      755  93.7% __libc_start_main 

    每行对应一个函数的统计。第一,二列是该函数的本地采样(不包括被该函数调用的函数中的采样次数)次数和比例,第三列是该函数本地采样次数占当前所有已统计函数的采样次数之和的比例。第四,五列是该函数的累计采样次数(包括其调用的函数中的采样次数)和比例。 

pprof  --gif  ./RBtree ./RBtree.prof  > graph.gif  生成的gif统计图如下。


 

    图中每个节点对应一个函数,节点中的文字分别为类名,函数明,本地采样次数比例和累计采样次数比例(如果跟本地相同则省略)。每条边表示一个函数调用关系:caller调用callee,边上的数字表示callee中因为caller调用而被采样的次数。 

    pprof如果不带任何选项调用(只有可执行文件路径和profile文件路径)则进入互动模式,在互动模式下可使用gv,gif,text等命令来替代前面介绍的带选项的pprof调用。 

二. Heap Checker 

    堆内存泄漏检测工具。使用简单,先在链接被检查程序的时候用-ltcmalloc选项连接Goolge Perftools的堆内存管理库tcmalloc(tcmalloc会替代C的堆内存管理库),然后每次用命令行“env HEAPCHECK=normal 可执行程序路径”来进行检查,其中检查形式normal可以替换成其他值,检查的结果会以屏幕报告的形式给出。以下给出一个实例: 

# cat test_heap_checker.cpp
#include <cstdio>
#include <cstdlib>
int* fun(int n)
{
    int *p1=new int[n];
    int *p2=new int[n];
    return p2;
}
int main()
{
    int n;
    scanf("%d",&n);
    int *p=fun(n);
    delete [] p;
    return 0;
}
# g++ -O0 -g test_heap_checker.cpp -ltcmalloc -o test_heap_checker 

# env HEAPCHECK=normal /home/hongcheng/mycode/google-perftools-tests/test_heap_checker
WARNING: Perftools heap leak checker is active -- Performance may suffer
100
Have memory regions w/o callers: might report false leaks
Leak check _main_ detected leaks of 400 bytes in 1 objects
The 1 largest leaks:
Leak of 400 bytes in 1 objects allocated from:
If the preceding stack traces are not enough to find the leaks, try running THIS shell command:
pprof /home/hongcheng/mycode/google-perftools-tests/test_heap_checker "/tmp/test_heap_checker.13379._main_-end.heap" --inuse_objects --lines --heapcheck  --edgefraction=1e-10 --nodefraction=1e-10 --gv
If you are still puzzled about why the leaks are there, try rerunning this program with HEAP_CHECK_TEST_POINTER_ALIGNMENT=1 and/or with HEAP_CHECK_MAX_POINTER_OFFSET=-1
Exiting with error code (instead of crashing) because of whole-program memory leaks 

    上面的报告显示有400个字节的内存泄漏,并提示使用pprof进一步跟踪泄漏来源的方法。 

    包括normal在内总共有4种泄漏检查方式:minimal,忽略进入main函数之前的初始化过程;normal,报告所有的无法再引用的内存对象;strick,在normal的基础上增加一些额外的检查;draconian,在程序退出的时候存在未释放的内存的情况下报错。 

    除了前面使用env命令行的全局内存泄漏检查方式外,还可以作对代码段的更加细粒度的泄漏检查。这里需要先在源代码中包含头文件google/heap-checker.h。下面是一个检查代码段的实例: 

       HeapLeakChecker heap_checker("test_foo");
    {
        code that exercises some foo functionality;
        this code should preserve memory allocation state;
    }
    if (!heap_checker.SameHeap()) assert(NULL == "heap memory leak"); 

  在进入代码段之前建立当前堆内存使用情况的snapshot,然后在结束代码段的时候通过与记录的snapshot对比检查是否有泄漏。方法NoLeaks()也可以用在这里。下面是一个实例: 

    #include <cstdio>
    #include <cstdlib>
    #include <cassert>
    #include <google/heap-checker.h>
    int* fun(int n)
    {
        int *p2;
        HeapLeakChecker heap_checker("fun");
        {
            new int[n];
            p2=new int[n];
            //delete [] p1;
        }
        assert(!heap_checker.NoLeaks());
        return p2;    
    }
    int main(int argc,char* argv[])
    {
        int n;
        scanf("%d",&n);
        int *p=fun(n);
        delete [] p;
        return 0;
    } 

    注意被检查程序的main函数形式必须为带2个参数的形式,否则会在编译时报告重复定义。运行env命令行将会报告assert失败。

    另外,还可以跳过某些代码段的检查,方式如下: 

        {
        HeapLeakChecker::Disabler disabler;
        <leaky code>
    } 

  <leaky code>处的代码将被heap-checker忽略。 

三. Heap Profiler 

    堆内存使用情况统计工具。有两种使用方法。 

    1. 全局profile,在连接的时候使用-ltcmalloc选项,然后使用命令行“env HEAPPROFILE=prefix 可执行程序路径”来生成若干profile数据文件,这里的prefix是生成的profile文件的路径前缀。 

    2. 代码段profile,在源程序中包含头文件<google/heap-profiler.h>,然后调HeapProfilerStart(char* prefix),HeapProfilerStop(), 

HeapProfilerDump(char* filename)和GetHeapProfile()函数来确定代码段,输出profile文件等。其中HeapProfilerStart的参数是周期性输出文件的前缀,HeapProfilerDump的参数是当前heap的profile输出文路径。 

    两种方式都会周期性生成 prefix.0000.heap, prefix.0001.heap一系列profile文件,用于进一步的分析。这里的周期性是指一旦一定数量的对内存被allocated就生成新的profile文件。环境变量HEAP_PROFILE_ALLOCATION_INTERVAL用于控制这一数量(单位为字节),默认为1GB。 

  可以用pprof程序处理生成的profile数据文件以身生成可读的文本或者图形统计文件,使用方法跟前面介绍的CPU profiler中的pprof几乎一样,除了采样次数被替换成申请的堆内存数量。


dump heap及分析内存泄漏 服务范围 阅读详情

相关推荐

使用google-perftools优化nginx在高并发时的性能完整教程[第二版]_nginx --with-google_preftools_module

在这里注意这步,如果是32位系统,可以不添加 --enable-frame-pointers,如果是64位系统,并且你之前没有安装libunwind,那么你一定要添加这个:–enable-frame-pointers。为了使Nginx支持google-perftools,需要加上–with-google_perftools_module重新编译Nginx,如果不知道如何安装Nginx,可以从这里查看。如果是使用添加–enable-frame-pointers的方式,先不管,咱们往下走.

2401_85599069的博客 1059

Google Perftools - 安装

我在本文件夹下创建了一个 build 文件夹,设置为 build 依然执行失败;替换为 build 的完整路径即可。伊织 2021-10-26。要被替换为完整路径;

AI工程化、开源分享、文档翻译、代码笔记 766

使用google-perftools优化nginx在高并发时的性能完整教程[第二版]_nginx --with-google_preftools_module(3)

在这里注意这步,如果是32位系统,可以不添加 --enable-frame-pointers,如果是64位系统,并且你之前没有安装libunwind,那么你一定要添加这个:–enable-frame-pointers。为了使Nginx支持google-perftools,需要加上–with-google_perftools_module重新编译Nginx,如果不知道如何安装Nginx,可以从这里查看。如果是使用添加–enable-frame-pointers的方式,先不管,咱们往下走.

2401_84562251的博客 658

性能测试工具Google perftools(简称gperftool)配置及使用

一、配置环境 二、使用 三、分析报告 四、pprof选项

m0_50179075的博客 8560

使用google-perftools优化nginx在高并发时的性能完整教程[第二版]_nginx --with-google_preftools_module(2)

为了使Nginx支持google-perftools,需要加上–with-google_perftools_module重新编译Nginx,如果不知道如何安装Nginx,可以从这里查看。我的服务器因为有8核,所以开启了8个Nginx线程,每个线程会有一行类似的记录.修改/usr/local/nginx/conf/ncing.conf。讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**到这里安装google-perftools完成.到这里安装Nginx完成.到这里安装优化完成.

2401_84562251的博客 669

google-perftools-开源

我们见过的最快的malloc; 与线程和STL配合使用特别好。 另外:线程友好的堆检查器,堆分析器和cpu分析器。

性能测试工具二——google-perftools(采样测试)

google-perftools

liugan528的博客 762

copilot基于 DeepSeek-R1 思路构建 VLA 自动驾驶强化学习系统

下面给出一个完整示例代码,结合 DeepSeek‑R1 的技术方法,实现一个端到端的 VLA(视觉+语言行动)自动驾驶深度强化学习系统。.2f。

ywfwyht的博客 775

安装和使用google-perftools工具

google-perftools1.google-perftools简介2.ubuntu下的安装3.使用 1.google-perftools简介 简介略 2.ubuntu下的安装 默认安装路径为/usr/local/,头文件和库文件分别在/usr/local/inlcude/google/和/usr/local/lib/下 1 从github上下载源码https://github.com/gperftools/gperftools git clone https://github.com/gperft

大灰狼吃树皮 4220

Nettrace 源码分析

文章介绍:本文将围绕腾讯开源项目nettrace工具中数据采集,数据处理,数据分析三个模块深入源码分析其实现细节

abobob的博客 989

Qi标准下的充电协议及其记忆技巧

记忆无线充电协议中的。

m0_73991989的博客 1320

Google perftools

1、功能简介 它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数(得到函数之间的调用关系)耗时情况一目了然。在对程序做性能优化的时候,这个是很重要的,先把最耗时的若干个操作优化好,程序的整体性能提升应该十分明显,这也是做性能优化的一个最为基本的原则—先优化最耗时的。 2、安装 1、下载gperftools Wgethttps://code.google.com/p/gperftools/downloads/detail?name=gp.

weixin_43841155的博客 626

FreeRTOS项目:智能手表(1);

从 “最底层启动”→“系统基础配置”→“硬件驱动”→“中间件能力封装”→“上层业务功能”,分层递进、从基础到应用,就能逐步把整个项目的逻辑串联起来~

weixin_46847454的博客 1447

nginx性能优化调优之google-perftools

nginx性能优化调优之google-perftools 转载:https://www.yisu.com/zixun/5815.html 什么是google-perftools? google-perftools是google公司开发的一款针对 C/C++ 程序的性能分析开源工具,使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析 google-perftools包含四个工具,分别是:TCMalloc、heap-checker、heap-profiler和cpu-profiler,其中我们

qq_41886297的博客 1156

SAP CAP 编程模型简介

官网 CAP 是用于构建企业级服务和应用程序的语言、库和工具框架。它引导开发人员沿着经过验证的最佳实践和大量现成的解决方案来应对重复性任务的“黄金之路”。 基于 CAP 的项目受益于对领域的主要关注。我们没有深入研究过于技术性的学科,而是专注于在快速变化的云技术世界中加速开发和保护投资。 CAP 框架融合了经过验证和广泛采用的开源和 SAP 技术,如下图所示。 在开源技术之上,CAP主要增加了: 核心数据服务 (CDS) 作为我们用于域模型和服务定义的通用建模语言。 用于 Node.js 和 Ja

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1547

C#串口通信从入门到精通(11)——串口接收的数据存储到本地文件(txt、csv)

本文详细介绍如何将串口通信将数据进行本次存储,主要介绍常用的csv、txt格式文件,由多年实战经验总结,绝对干货!

qq_34059233的博客 7239

google-perftools 简介

google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU 时间片的剖析。 google-perftools 对一个程序的 CPU 性能剖析包括以下几个步骤。 1. 编译目标程序,加入对 googl

swrd 825

Qt入门教程【Core篇】singal and slot信号与槽

Qt中信号与槽singal and slot

小鱼酱的博客 2450

google-perftools安装

source link:http://blog.sina.com.cn/s/blog_704836f40100yvyx.html 1.编译libunwind库   因为使用的是X86_64的Linux系统,因此需要安装libunwind库。 安装方法很简单,常见的configure,make,make install的套路。   wget http://down

一剪梅 4009

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

weixin_42162924的博客 40

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Twitter Ostrich性能剖析:Heapster与Google Perftools集成完整指南

Twitter Ostrich是一个为Scala服务器设计的性能统计收集与报告库,虽然目前已被标记为**已弃用**(deprecated),但它在性能监控领域留下了宝贵的技术遗产。本文将深入剖析Ostrich的核心功能,并重点讲解如何将其与Heapster和Google Perftools进行集成,为您的服务器性能分析提供完整的技术方案。 ## 🚀 Ostrich性能监控核心功能 Ostri

gitblog_00196的博客 788

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: window系统通过RawCap抓取回路数据包
下一篇: 使用Nginx+Keepalived组建高可用负载平衡Web server集群
forfuture3513
博客等级 码龄15年 76粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值