TCMalloc小记【转】
转自:http://blog.csdn.net/chosen0ne/article/details/9338591
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[-]
- 一 原理
- 二 安装和使用
周末抽空看了一下tcmalloc,了解了个大概。下面记录一下。
一. 原理
tcmalloc就是一个内存分配器,管理堆内存,主要影响malloc和free,用于降低频繁分配、释放内存造成的性能损耗,并且有效地控制内存碎片。glibc中的内存分配器是ptmalloc2,tcmalloc号称要比它快。一次malloc和free操作,ptmalloc需要300ns,而tcmalloc只要50ns。同时tcmalloc也优化了小对象的存储,需要更少的空间。tcmalloc特别对多线程做了优化,对于小对象的分配基本上是不存在锁竞争,而大对象使用了细粒度、高效的自旋锁(spinlock)。分配给线程的本地缓存,在长时间空闲的情况下会被回收,供其他线程使用,这样提高了在多线程情况下的内存利用率,不会浪费内存,而这一点ptmalloc2是做不到的。
tcmalloc区别的对待大、小对象。它为每个线程分配了一个线程局部的cache,线程需要的小对象都是在其cache中分配的,由于是thread local的,所以基本上是无锁操作(在cache不够,需要增加内存时,会加锁)。同时,tcmalloc维护了进程级别的cache,所有的大对象都在这个cache中分配,由于多个线程的大对象的分配都从这个cache进行,所以必须加锁访问。在实际的程序中,小对象分配的频率要远远高于大对象,通过这种方式(小对象无锁分配,大对象加锁分配)可以提升整体性能。
线程级别cache和进程级别cache实际上就是一个多级的空闲块列表(Free List)。一个Free List以大小为k bytes倍数的空闲块进行分配,包含n个链表,每个链表存放大小为nk bytes的空闲块。在tcmalloc中,<=32KB的对象被称作是小对象,>32KB的是大对象。在小对象中,<=1024bytes的对象以8n bytes分配,1025<size<=32KB的对象以128n bytes大小分配,比如:要分配20bytes则返回的空闲块大小是24bytes的,这样在<=1024的情况下最多浪费7bytes,>1025则浪费127bytes。而大对象是以页大小4KB进行对齐的,最多会浪费4KB - 1 bytes。下图就是一个基本的free list的示意图:
实际上,一个free list(我称之为空闲块列表)就是一个数组索引多个链表,每个链表存放相同大小的块。可以根据要分配的内存大小size算出合适的块在free list中的下标,然后找到对应的空闲块链表。
tcmalloc的数据结构组织如下:
Thread-local free list:线程本地的空闲块cache,用于分配小对象。
Heap free list:中心free list,全局唯一,用于按页对齐分配大对象或者是将连续的多个页(被称作span)分割成多个小对象的空闲块分配给thread-local free list。
Page array:用于描述当前tcmalloc持有的内存状态,完成的是从page number到span的映射。
下面看一下小对象的分配:
(1)根据分配的size计算出对应的空闲块大小,从而确定对应空闲块链表,然后从thread local的free list进行分配。
(2)如果的空闲块链表非空,直接将头结点对应的空闲块返回并从空闲块链表中将其删除。
(3)如果空闲块链表是空的,需要从heap free list获取一个span。如果heap free list非空,则将span切分成多个相同大小的空闲块插入空闲块链表中,然后返回头结点。
(4)如果heap free list是空的,则调用sbrk或者mmap进行内存的分配一系列连续的内存页,作为span,然后切分成多个相同大小的空闲块插入空闲块链表,然后返回头结点。
大对象的分配就要简单多了,直接从heap free list分配4nKB大小的空闲块即可,如果heap free list不存在该大小的空闲块,通过系统调用分配连续的内存页。
tcmalloc还会对thread local cache进行垃圾收集,从而避免内存浪费。
二. 安装和使用
tcmalloc属于gperftools,安装比较简单,需要注意一下,在64bit系统上需要先安装libunwind(http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-beta.tar.gz,只能是这个版本),这个库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API,32bit系统不需安装。在安装过程中,可能出现下列错误:
- gcc -DHAVE_CONFIG_H -I. -I../include -I../include -I../include/tdep-x86_64 -I. -D_GNU_SOURCE -DNDEBUG -g -O2 -fexceptions -Wall -Wsign-compare -MT setjmp/longjmp.lo -MD -MP -MF setjmp/.deps/longjmp.Tpo -c setjmp/longjmp.c -fPIC -DPIC -o setjmp/.libs/longjmp.o
- /usr/include/x86_64-linux-gnu/bits/setjmp2.h:26:13: error: 'longjmp' aliased to undefined symbol '_longjmp
是因为缺少编译选项U_FORTIFY_SOURCE,解决方法有两种:
1,尚未调用configure进行配置,则执行CPPFLAGS=-U_FORTIFY_SOURCE ./configure ... 会自动将编译选项添加到Makefile中。
2,已经配置过,直接修改Makefile,查找CPPFLAGS然后添加上-U_FORTIFY_SOURCE。
然后就是安装gperftools,这个正常安装即可,默认安装到/usr/local/lib下,完成后调用lddconfig添加到动态链接库缓存,然后就可以使用了。
使用方法,很简单,在编译时加上tcmalloc动态链接库即可
- g++ test.cpp -ltcmalloc
源码不需任何修改,tcmalloc会自动替换掉glibc默认的malloc和free,简简单单的一条命令就可以提升不少性能,very good。
转载于:https://www.cnblogs.com/sky-heaven/p/6844726.html
TCMalloc小记【转】相关推荐
- tcmalloc mysql 缓存_Tcmalloc优化Mysql内存管理
实验环境: OS:Redhat 5.3 64bit Mysql:mysql 5.5.29 TCMalloc(Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能, ...
- TCMalloc(Thread-Caching malloc) 基本设计原理
文章目录 背景 如何使用 架构概览 1. TCMalloc Front-end 1.1 小对象和大对象的内存分配过程 1.2 内存释放过程 1.3 Per-CPU mode 1.4 Per-threa ...
- 利用TCMalloc替换Nginx和Redis默认glibc库的malloc内存分配
TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员.与标准的glibc库的Malloc相比,TCMalloc库在内存分 ...
- Redis源码分析-TCMalloc
redis很多地方都在调用zmalloc函数 zmalloc在这里定义zmalloc.c void *zmalloc(size_t size) {void *ptr = malloc(size+PRE ...
- TCMalloc:线程缓存的Malloc
转载自: http://shiningray.cn/tcmalloc-thread-caching-malloc.html 作者:Sanjay Ghemawat, Paul Menage 原文 翻译: ...
- hp-ux 集群,内存 小记
hp-ux 集群,内存 小记 -----查看hp 集群状态信息 # cmviewcl -v CLUSTER STATUS dbsvr up ...
- <笔记2>numpy的生成随机数用法小记
numpy的生成随机数用法小记 numpy生成随机数 <以下图片来自黑马程序猿录播课程笔记> import numpy as np import random #random 生产随机数 ...
- 2021年中寻找新SAP项目机会小记
2021年中寻找新SAP项目机会小记 最近一段时间,笔者有在酝酿下一个SAP项目机会.在与相关业界同仁洽谈项目机会的过程中,笔者发现自己还是在犯一些低级错误,感觉自己还是太不够理性和成熟. 1,事情没 ...
- K项目小记 - 项目已开工整整四周!
K项目小记 - 项目已开工整整四周! 至今天,K项目已经推进到了第四周.这四周时间里,我们项目组全体成员经历了一段刻骨铭心的战斗时光.我们每天开会,谈流程,展示全球模板,找GAP.K项目是以客户总部的 ...
最新文章
- World of Darkraft(codeforces 138D)
- substrate 区块链框架 (1)概述
- php复习,PHP排序算法的复习和总结
- 安装node.js,CoffeeScript,Express.js,mysql,jade
- Ubuntu 更改 默认的Python版本
- catia曲面设计从入门到精通_CATIA V5 曲面设计从入门到精通
- oracle数据库导入gson包
- ddrescue重建损坏磁盘
- python学习之记事本
- 数学建模算法体系分类
- 统计通话次数和时间的软件_通话时间统计官方版
- 低通滤波器转带通滤波器公式由来_什么是-3dB截止频率?浅析滤波器原理、分类和滤波器优化!...
- 如何学习硬件设计——理论篇
- 安卓应用市场互相抓取app包
- 数据权限简单设计思路
- 该计算机已安装了更高版本的,电脑安装iTunes时提示这台电脑已安装了更高版本怎么解决...
- 云和恩墨大讲堂新春第一讲-Oracle安全特性之加密登陆
- win10控制台打开远程桌面连接
- python OpenCV:绘制一个圆形图片
- AcWing 1293. 夏洛克和他的女友(二分图染色 思维 线性筛)
热门文章
- JAVA451铝刀轮组怎么样,关于碳刀和铝刀轮组的区别
- 测试环境搭建流程_软件测试流程
- php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...
- eclipse 集成svn客户端_SVN的介绍以及使用
- datagrid底部显示水平滚动_CSS flex 布局,头部和底部固定,中间出现滚动条
- 史上最全的php面试题-带有答案,史上最全的PHP面试题-带有答案
- GitHub Actions 部署 VuePress 文档
- 学习编程你要记住以下几点
- mysql不带加密模式jar包_Spring boot jar包加密(防止放在客户端反编译)
- Android底部导航栏的实现(RadioGroup和Fragment结合使用)