ITPub博客

首页 > Linux操作系统 > Linux操作系统 > tcmalloc的工作原理

tcmalloc的工作原理

原创 Linux操作系统 作者:myownstars 时间:2015-03-08 11:28:06 0 删除 编辑

Tcmalloc优势

1 速度快

ptmalloc在一台2.8GHz的P4机器上(对于小对象)执行一次malloc及free大约需要300纳秒。而TCMalloc的版本同样的操作大约只需要50纳秒。

2 降低了锁争用

TCMalloc减少了多线程程序中的锁争用情况。对于小对象,几乎已经达到了零争用。对于大对象,TCMalloc尝试使用粒度较好和有效的自旋锁。

3 节省内存

分配N个8字节对象使用大约8N * 1.01字节的空间。而ptmalloc2中每个对象都使用了一个四字节的头。

尽管ptmalloc2也实现了per-thread缓存,,第一个线程申请的内存,释放的时候还是必须放到第一个线程池中(不可移动),这样可能导致大量内存浪费。

ptmalloc2 also reduces lock contention by using per-thread arenas but there is a big problem with ptmalloc2's use of per-thread arenas. In ptmalloc2 memory can never move from one arena to another. This can lead to huge amounts of wasted space.

tcmalloc跨线程归还内存,是因为所有线程公用了底层的一个分配器?,所以跨线程归还是无需加锁的。

 

 

Tcmalloc概述

tcmalloc将内存请求分为两类,大对象请求和小对象请求,大对象为>=32K的对象。

tcmalloc会为每个线程分配本地缓存,小对象请求可以直接从本地缓存获取,如果没有空闲内存,则从central heap中一次性获取一连串小对象。

tcmalloc对于小内存,按8的整数次倍分配,对于大内存,按4K的整数次倍分配。

当某个线程缓存中所有对象的总大小超过2MB的时候,会进行垃圾收集。垃圾收集阈值会自动根据线程数量的增加而减少,这样就不会因为程序有大量线程而过度浪费内存。

 

 

使用

要使用TCMalloc,只要将tcmalloc通过“-ltcmalloc”链接器标志接入你的应用即可。

也可以通过LD_PRELOAD动态加载:$ LD_PRELOAD=”/usr/lib/libtcmalloc.so”

 

To use TCmalloc, just link tcmalloc into your application via the "-ltcmalloc" linker flag.

You can use tcmalloc in applications you didn't compile yourself, by using LD_PRELOAD:$ LD_PRELOAD="/usr/lib/libtcmalloc.so"

LD_PRELOAD is tricky, and we don't necessarily recommend this mode of usage.

 

Mysql要使用tcmalloc,可以把tcmalloc动态库加到mysqld_safe中启动;

也可也静态编译,要依次编译libunwind,tcmalloc,然后编译mysql,configure中加入–with-mysqld-ldflags=-ltcmalloc选项,具体可参照

http://www.itpub.net/thread-1363139-1-1.html#

 

 

 

申请内存

1. 首先根据申请空间的大小从当前线程的可用内存块里面找(每个进程维护一组链表,每个链表代表一定大小的可用空间)

2. 如果step 1没有找到,则到central list里面查找(central list跟线程各自维护的list结构很像,为不同的size各自维护一组可用空间列表)

3. 如果step 2 central list也没有找到,则计算分配size个字节需要分配多少page(变量:class_to_pages)

4. 根据pagemap查找page对应的可用的span列表,如果找到了,则直接返回span,central list会将该span切割成合适的大小放入对应的列表中,然后交给thread cache

5. 如果step 4没有找到可用的span,则向OS直接申请,然后步骤同step 4。

注意的是tcmalloc向系统申请空间有三种方式:sbrk,mmap,/dev/mem文件,默认是三种都try的,一种不行换另外一种。

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

 

 

线程释放资源:

1. 释放某个object

2. 找到该object所在的span

3. 如果该span中所有object都被释放,则释放该span到对应的可用列表,在释放的过程中,尝试将该span跟左右spans merge成更大的span

4. 如果当前thread cache的free 空间大于指定预置,归还部分空间给central list

5. central list也会试图通过释放可用span列表的最后几个span来将不用的空间归还给OS

tcmalloc向OS申请/释放资源是以span为单位的。

 

 

参考链接

http://shiningray.cn/tcmalloc-thread-caching-malloc.html

http://www.cnblogs.com/raymondshiquan/archive/2011/06/25/tcmalloc_configuration_analysis.html

http://www.cppblog.com/feixuwu/archive/2010/07/10/119980.html

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-1452219/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3095296