TcMalloc,A Big Surprise!

本文深入探讨了Tcmalloc内存管理技术,通过实例展示了如何利用其特性优化多线程并发处理输入数据的程序性能,显著提高了处理速度并降低了CPU负载。
Tcmalloc早有耳闻,没有进行过细节的了解,直到最近有同事在几个模块中使用,才领略到它的强大!

场景:
模块多线程并发处理输入数据,大量使用各种STL容器,运行内存30G。
程序重启,导入历史后,处理速度变慢,数个小时候后才能回到正常处理速度,处理速度慢期间,cpu idle高

分析:
重启后,缓存的内存被收回,大量内存需要重新分配,cpu频繁锁在malloc上

解决:
1. 使用STL内存分配器:__mt_alloc
参考:http://blog.youkuaiyun.com/yfkiss/article/details/6633337
2. 使用tcmalloc

使用Tcmalloc:
下载编译google-perftool(performance tool,includes TCMalloc, heap-checker, heap-profiler and cpu-profiler.)
将tcmalloc通过“-ltcmalloc”链接器标志接入模块

Tcmalloc概述
tcmalloc将内存请求分为两类,大对象请求和小对象请求,大对象为>=32K的对象。|
tcmalloc会为每个线程分配线程局部缓冲
对于小对象请求,可以直接从线程局部缓冲区获取,如果线程局部缓冲区没有空闲内存,则从central heap中一次性获取一连串小对象。
tcmalloc对于小内存,按8的整数次倍分配,对于大内存,按4K的整数次倍分配。
这样做有两个好处,一是分配的时候比较快。二是短期的收益比较大,分配的小内存至多浪费7个字节,大内存则4K
当某个线程缓存当缓存中所有对象的总共大小超过2MB的时候,会对他进行垃圾收集。垃圾收集阈值会自动根据线程数量的增加而减少,这样就不会因为程序有大量线程而过度浪费内存。
更细节可以参考:http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html

Tcmalloc在不需要增加任何开发代价的情况下,就可以使得程序有可能在性能上有一个飞跃,so, try it~

### TCMalloc简介 TCMalloc (Thread-Caching Malloc) 是Google开发的一种高效内存分配器,旨在提高多线程应用程序性能。其设计目标是在减少锁争用的同时提供快速的内存分配操作[^2]。 #### 主要特性 - **高速度**:通过缓存机制减少了频繁请求操作系统资源的需求。 - **低延迟**:优化了常见大小对象的分配路径,使得大多数情况下可以立即返回结果给调用者。 - **良好的扩展性**:特别适合于高度并发的应用场景,在处理大量短生命周期的小型对象时表现出色[^4]。 ### 使用方法 对于希望利用TCMalloc提升应用效率的情况,可以通过编译选项来启用它: ```bash gcc -o your_program your_program.c -ltcmalloc ``` 上述命令会将`your_program.c`文件编译成可执行文件,并链接上`tcmalloc`动态库以替代默认的标准C库中的`malloc()`函数实现方式。 另外还可以设置环境变量来进行更灵活控制: ```bash export LD_PRELOAD=/usr/lib/libtcmalloc.so ./your_program ``` 这种方式可以在不修改源码的情况下临时切换到TCMalloc作为当前进程使用的内存管理工具[^1]。 ### 性能对比与其他选择 当考虑在多线程环境中部署时,与同类产品如jemalloc相比,虽然两者都能充分利用CPU资源完成任务,但是TCMalloc展示出了更低的页面错误率以及更好的内存驻留集尺寸表现,这意味着它可以更加有效地管理和重用已有的物理内存空间[^3]。 ### 适用范围 由于TCMalloc具备出色的响应时间和较低的竞争开销,因此非常适合那些需要频繁创建销毁小型数据结构且运行期间存在较高程度并行性的软件项目,例如Web服务器、数据库管理系统或是大规模分布式计算框架等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值