TCMalloc 安装与使用
TCMalloc 安装和使用
Author:Echo Chen(陈斌)
Email:chenb19870707@gmail.com
Date:October 20th, 2014
前面三篇译文《TCMalloc:线程缓冲的Malloc》、《使用TCMalloc的堆栈检查》、《使用TCMalloc进行堆栈分析》介绍了TCMalloc的基本原理,以及堆栈分析和检查工具,TCMalloc长处非常多。比glibc
2.3的malloc快、自带的堆栈工具能够轻松找出内存瓶颈和内存泄漏。给server开发指明了一条新的道路。
一、下载
google-perftools:http://code.google.com/p/google-perftools/gperftools-2.1.tar.gz
libunwind:http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz
二、libunwind安装
64位操作系统请先安装 libunwind库,32位操作系统不要安装。libunwind库为基于64位CPU和操作系统的程序提供了主要的堆栈辗转开解功能。当中包含用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。
1: #tar zxvf libunwind-1.1.tar.gz
2: #cd libunwind-1.1
3: #./configure
4: #make
5: #make install
三、安装google-perftools:
1: #tar zxvf tar zxvf gperftools-2.1.tar.gz
2: #cd gperftools-2.1
3: #./configure
4: #make
5: #make install
四、TCMalloc库载入到Linux系统中:
1: echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
2: /sbin/ldconfig
五、使用
在Makefile中 加入TCMalloc链接,注意:这里为了进行内存泄漏分析,一定要将TCMalloc链接在最后,官方文档里说:堆栈检查器可能误解列在它后面的链接库的一些内存。
1: # funshion wuhan game studio
2: # Created by zeng jun fei in 2013-08-08
3:
4: CXX = g++
5: # debug
6: CXXFLAGS = -g -I../BaseCode -I../../CommonSrc -Wall -D_POSIX_MT_ -O0
7: CXXLFLAGS = -g -Wall -L../bin -lBaseCode -lpthread -lprotobuf -rdynamic -ltcmalloc
8:
9: # release
10: # CXXFLAGS = -O3 -g -I../NetworkEngine -Wall
11: # CXXLFLAGS = -O3 -g -Wall -L../NetworkEngine -lnetwork
12:
13: LIB_NETWORK = ../bin/libBaseCode.a
14:
15: OBJS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
16: SRCS = $(OBJS:%.o=%.cpp)
17: DEPS = $(OBJS:%.o=%.d)
18:
19: ALL_TARGETS = ../bin/GateServer
20:
21: all: $(ALL_TARGETS)
22:
23: -include $(DEPS)
24: $(DEPS): %.d: %.cpp
25: @$(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; rm -f $@.$$$$
26:
27: $(OBJS): %.o: %.cpp
28: $(CXX) -c $(CXXFLAGS) $< -o $@
29:
30: $(ALL_TARGETS): $(OBJS) $(LIB_NETWORK)
31: $(CXX) $(OBJS) -o $@ $(CXXLFLAGS)
32:
33: clean:
34: @rm -rf $(OBJS) $(ALL_TARGETS) *.d
35:
六、堆栈检查和分析
首先,设置pperf的环境变量:export PPROF_PATH=/usr/local/bin/pprof
測试代码:
1: #include <iostream>
2: using namespace std;
3:
4: int main()
5: {
6: int *p = new int();
7: return 0;
8: }
编译:g++ main.cpp -o main -ltcmalloc -g -O0
内存泄漏检查: env HEAPCHECK=normal ./main
结果:
WARNING: Perftools heap leak checker is active -- Performance may suffer If the preceding stack traces are not enough to find the leaks, try running THIS shell command: pprof ./main "/tmp/main.54616._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 |
上面的报告显示有4个字节的内存泄漏,并提示使用pprof进一步跟踪泄漏来源的方法。
包含normal在内总共同拥有4种泄漏检查方式:minimal,忽略进入main函数之前的初始化过程;normal。报告全部的无法再引用的内存对象。strick,在normal的基础上添加一些额外的检查;draconian。在程序退出的时候存在未释放的内存的情况下报错。
依据《使用TCMalloc的堆栈检查》,除了前面使用env命令行的全局内存泄漏检查方式外,还能够作对代码段的更加细粒度的泄漏检查。
这里须要先在源码中包括头文件google/heap-checker.h。
实例代码例如以下:
1: #include <cstdio>
2: #include <cstdlib>
3: #include <cassert>
4: #include <google/heap-checker.h>
5: int* fun(int n)
6: {
7: int *p2;
8: HeapLeakChecker heap_checker("fun");
9: {
10: new int[n];
11: p2=new int[n];
12: //delete [] p1;
13: }
14: assert(!heap_checker.NoLeaks());
15: return p2;
16: }
17: int main(int argc,char* argv[])
18: {
19: int n;
20: scanf("%d",&n);
21: int *p=fun(n);
22: delete [] p;
23: return 0;
24: }
此外,还能够忽略某些已知的内存泄漏:
1: #include
2: ...
3: void *mark = HeapLeakChecker::GetDisableChecksStart();
4: <leaky code>
5: HeapLeakChecker::DisableChecksToHereFrom(mark);
感觉跟valgrind效果差点儿相同,可是valgrind还能查出内存越界。更加优秀。
七、总结
本来研究TCMalloc是为了优化游戏server,解决游戏server后期玩家流失后。占用大量内存的浪费。结果发现因为我们游戏server为了防止内存碎片和频繁调用new和delete带来的性能损耗。使用了大量的内存池对象(如装备池、技能池、玩家池),这些池都不会调用delete还给系统,所以即使使用了TCMalloc也不会有内存释放,如今也明确了server维护的意义,当然这和server框架设计非常有关系,假设没有这些缓冲池,直接调用new和delete,TCMalloc会是一个非常好的选择。
-
Echo Chen:Blog.csdn.net/chen19870707
-
版权声明:本文博主原创文章。博客,未经同意不得转载。
TCMalloc 安装与使用的更多相关文章
- TCMalloc 安装和使用
前面三篇译文<TCMalloc:线程缓冲的Malloc>.<使用TCMalloc的堆栈检查>.<使用TCMalloc进行堆栈分析>介绍了TCMalloc的基本原理, ...
- tcmalloc安装
环境是centos 6 (64位) yum list libunwind-devel (epel 源) wget https://gperftools.googlecode.com/files/gp ...
- Gperftools中tcmalloc的简介和使用(转)
TcMalloc(Thread-CachingMalloc)是google-perftools工具中的一个内存管理库,与标准的glibc库中malloc相比,TcMalloc在内存分配的效率和速度上要 ...
- 源码部署pxc集群
想了想还是研究一下怎么源码安装pxc吧,毕竟很多组件都是源码安装的. 环境: yum install -y boost-devel libodb-boost-devel check-devel ope ...
- [转]JVM内存模型
最近排查一个线上java服务常驻内存异常高的问题,大概现象是:java堆Xmx配置了8G,但运行一段时间后常驻内存RES从5G逐渐增长到13G #补图#,导致机器开始swap从而服务整体变慢.由于Xm ...
- CentOS运维常用管理操作命令
自己整理的整理Linux常用运维和linux常用管理操作命令,当然不是非常详细和丰富,但是也基本上够用了吧.欢迎留言补充更多的Linux常用运维和linux常用管理操作命令.不断完善中.... 备份m ...
- mysql安装tcmalloc
TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多, ...
- redis(二)redis+TCMALLOC高性能的缓存服务器的安装配置
安装 1准备编译环境 yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel 2 下载源码包(由于goog ...
- TcMalloc的介绍以及Windows下安装使用
本文由博主(SunboyL)原创,转载请注明出处:http://www.cnblogs.com/xsln/p/Introduction_TcMalloc.html 介绍: TcMalloc(Threa ...
随机推荐
- Android学习-各种对话框
在android的编程中,对话框的用处是非常多的,然而,有时对对话框的需求也是不一样的,那么现在,就总结对话框的种类,以及事件的处理形势. 1.简单的对话框 public void showDialo ...
- 祖国版Solowheel!IPS103 独轮思维车 - 三个月体验报告
http://tieba.baidu.com/f?kz=2308652773&mo_device=1
- 非洲儿童(南阳oj1036)(馋)
非洲小孩 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 家住非洲的小孩,都非常黑.为什么呢? 第一.他们地处热带,太阳辐射严重. 第二,他们不常常洗澡.(常年缺水, ...
- XML,Object,Json分析转换Xstream采用
XML,Object,Json转换之浅析Xstream的使用 请尊重他人的劳动成果,转载请注明出处:XML,Object,Json转换之浅析Xstream的使用 XStream的是一个简单的库.主要用 ...
- Trie图和Fail树
Trie图和AC自动机的区别 Trie图是AC自动机的确定化形式,即把每个结点不存在字符的next指针都补全了.这样做的好处是使得构造fail指针时不需要next指针为空而需要不断回溯. 比如构造ne ...
- Spring Data Redis—Pub/Sub(附Web项目源码) (转)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- 神经网络BP算法C和python代码
上面只显示代码. 详BP原理和神经网络的相关知识,请参阅:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输 ...
- 线段树(单点更新and成段更新)
线段树需要的空间. 区间为1-->n 假设是一棵完全二叉树,且树高为i. 完全二叉树性质:第i层最多有2^(i-1)个结点. 那么 2^(i-1) = n; i = log2(n) + ...
- 项目构建之maven篇:2.HelloWorld项目构建过程
文件结构说明: 项目构建生命周期: 清理 编译 測试 打包 执行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的 ...
- android升级软件版本号,您安装后的新版本号,成功安装画面没有出现,或直接回到桌面
Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //an ...