linux tcmalloc,tcmalloc的工作原理

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选项,具体可参照

申请内存

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为单位的。

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值