2012年tcmalloc学习笔记之三

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 2012年tcmalloc学习笔记之三 一、几个基本概念 A.组织结构 1.线程局部缓存ThreadCache 2.中央数据结构CentralHeap B.内存对象 1.

2012tcmalloc学习笔记之三

一、几个基本概念

A.组织结构

1.线程局部缓存ThreadCache

2.中央数据结构CentralHeap

B.内存对象

1.大对象

2.小对象


C.测试

1.堆检查器

2.堆测量器


跨度

中央阵列


二、如何进行优化,提高性能

修改编译参数

./configure--disable-cpu-profiler --disable-heap-profiler --disable-heap-checker--enable-minimal –disable-dependency-tracking –disable-debugalloc

目的只生成最小的tcmalloc_minimal


./configure  --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal

目的只生成最小的tcmalloc_minimal

三、把tcmalloc动态库加到指定目录

sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  #如果没有这个文件,自己建一个
sudo /sbin/ldconfig


四、Mysql如何加入tcmalloc动态库


修改mysql服务的启动脚本mysqld_safe,在“#executing mysqld_safe”行后添加行:
exportLD_PRELOAD="/usr/local/lib/libtcmalloc.so"
目的是在启动mysql前,加载tcmalloc动态库。


五、小对象

将尺寸小于<=32K的对象,称之为“小对象”。

有划分为170个可分配的尺寸类别。

尺寸类别间隔:

较小的尺寸相差8字节;

较大的尺寸相差16字节;

再大一点的尺寸差32字节,如此类推。

最大的间隔(对于尺寸>=~2K的)是256字节。


一个线程缓存对每个尺寸类都包含了一个自由对象的单向链表

thread heap


六、分配小对象的算法

当分配一个小对象时:

目的:我们将其大小映射到对应的尺寸类中。

第一步:查找当前线程的线程缓存中相应的自由列表。

第二步:

如果自由列表不空:

1.首先移走自由列表里的第一个对象;

2.再返回该对象;

当按照这个算法的时候,TCMalloc不会获取任何锁。这就可以极大提高分配的速度,因为锁/解锁操作在一个2.8GHzXeon上大约需要100纳秒的时间。

如果自由列表为空:

首先,从该尺寸类别的中央自由列表(中央自由列表是被所有线程共享的)取得一连串对象。

再将他们放入线程局部的自由列表。

将新获取的对象中的一个返回给应用程序。

如果中央自由列表也为空:

第一步:我们从中央页分配器分配了一连串页面。

第二步:将他们分割成该尺寸类的一系列对象。

第三歩:像前面一样,将部分对象移入线程局部的自由列表中。

七、大对象

大对象直接使用页级分配器(一个页是一个4K的对齐内存区域)从中央堆直接分配。

由此可以看出,一个大对象总是页对齐的并占据了整数个数的页。

结论:

1.从中央堆里直接分配;

2.使用的技术手段页级分配器;

3.一个大对象总是页对齐的;

4.一个大对象总是占据了整数个数的页;

5.页是一个4K大小的对齐内存区域;

八、大对象与小对象的联系与区别

联系:连续的一些页面可以被分割为一系列小对象。

区别:但是他们的大小都相同。例如,一个连续的页面(4K)可以被划分为32128字节的对象。

九、跨度

1.跨度是什么?

连续的页面由一个“跨度”(Span)对象来表示。

或者说跨度用来表示连续的页面。

2.跨度的状态有哪些?

一个跨度可以是已被分配或者是自由的。

3.跨度状态说明:

如果是自由的,跨度则会是一个页面堆链表中的一个条目。

如果已被分配,它会是一个已经被传递给应用程序的大对象,或者是一个已经被分割成一系列小对象的一个页面。如果是被分割成小对象的,对象的尺寸类别会被记录在跨度中。

十、如何获取某个页面究竟属于哪个跨度

页面号索引的中央阵列可以用于找到某个页面所属的跨度。

也就是说,页面号有索引,索引保存在中央阵列,通过中央数组,可以找到页面的所属的跨度。

十一、如何实现中央阵列

在一个32位的地址空间中,中央阵列由一个2层的基数树来表示,其中根包含了32个条目,每个叶包含了215个条目(一个32为地址空间包含了2204K页面,所以这里树的第一层则是用25整除220个页面)。这就导致了中央阵列的初始内存使用需要128KB空间(215*4字节),看上去还是可以接受的。

64位机器上,我们将使用一个3层的基数树。

十二、一个32为地址空间包含了2204K页面,如何理解

页面的大小:4K= 4 * 210 = 212

一个32为地址空间寻址空间是:232

一个32为地址空间包含了232/ (4 * 210) = 220 4K页面

十三、如何释放内存

当一个对象被解除分配时,我们先计算他的页面号并在中央阵列中查找对应的跨度对象。该跨度会告诉我们该对象是大是小,如果它是小对象的话尺寸类别是什么。如果是小对象的话,我们将其插入到当前线程的线程缓存中对应的自由列表中。如果线程缓存现在超过了某个预定的大小(默认为2MB),我们便运行垃圾收集器将未使用的对象从线程缓存中移入中央自由列表。


如果该对象是大对象的话,跨度会告诉我们该对象覆盖的页面的范围。假设该范围是[p,q]。我们还会查找页面p-1和页面q+1对应的跨度。如果这两个相邻的跨度中有任何一个是自由的,我们将他们和[p,q]的跨度接合起来。最后跨度会被插入到页面堆中合适的自由列表中。

解读:小对象释放

当一个对象被释放的时候,

1.先计算出他的页面号;

2.然后去中央阵列中查找对应的跨度对象。该跨度会告诉我们对象是大对象,还是小对象;

3.如果是小对象,尺寸类别是什么;

4.我们将该类别,插入到当前线程的线程缓存中对应的自由列表中;

5.插入之后,如果线程缓存超过了某个预定的大小(默认为2MB),我们便运行垃圾收集器将未使用的对象从线程缓存中移入中央自由列表。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
存储 编译器 C语言
C++入门第五篇--内存管理
C++入门第五篇--内存管理
37 0
|
9月前
|
存储 缓存 算法
十五、Linux性能优化实战学习笔记 - Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等
223 1
|
9月前
|
存储 缓存 Linux
十八、Linux性能优化实战学习笔记- 内存泄漏了,我该如何定位和处理?
当进程通过 malloc() 申请虚拟内存后,系统并不会立即为其分配物理内存,而是在首次访问时,才通过缺页异常陷入内核中分配内存.对应用程序来说,动态内存的分配和回收,是既核心又复杂的一个逻辑功能模块。管理内存的过程中,也很容易发生各种各样的“事故”.
77 0
|
9月前
|
存储 编译器 Linux
内存管理基础概念总述
内存管理基础概念总述
59 0
|
10月前
|
存储 缓存 安全
《深入理解Java虚拟机》读书笔记(六)--HotSpot的算法细节实现
《深入理解Java虚拟机》读书笔记(六)--HotSpot的算法细节实现
174 0
《深入理解Java虚拟机》读书笔记(六)--HotSpot的算法细节实现
|
监控 数据可视化 Java
JVM技术之旅-带你认识一下JVM调优利器XXFox
JVM技术之旅-带你认识一下JVM调优利器XXFox
289 0
JVM技术之旅-带你认识一下JVM调优利器XXFox
|
存储 Linux C语言
C++从入门到精通(第六篇) :C++内存管理
又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。
131 0
C++从入门到精通(第六篇) :C++内存管理
|
存储 安全 算法
【GNU/Linux kernel源码分析】刨根问底,速览,对初学者友好的底层理解,让你对内核不再迷茫
【GNU/Linux kernel源码分析】刨根问底,速览,对初学者友好的底层理解,让你对内核不再迷茫
364 0
【GNU/Linux kernel源码分析】刨根问底,速览,对初学者友好的底层理解,让你对内核不再迷茫
|
存储 开发框架 安全
浅入.NETCore中的内存和GC知识
浅入.NETCore中的内存和GC知识
529 0
浅入.NETCore中的内存和GC知识