使用tcmalloc替换系统的malloc

本文记录了一次使用Google的TCMalloc内存分配器显著提升服务器处理能力的经历。原本在4万次/分的请求下CPU占用达400%,更换为TCMalloc后,在28万次/分的请求下CPU占用不到20%。

今天对服务器进行压测,模拟的请求量到4万次/分的时候,进程的CPU占用就已经达到400%了(也就是把四个核都占到100%)。其实模拟的请求数据都是单一的,不会因为BUG的原因导致CPU过高。怀疑是代码里的STL用得过多,加之ttserver和memcached大量的读操作——大量的小内存分配可能带来全局的锁竞争,从而可能使得CPU过高。

之前听说过google的tcmalloc是一个很好的线程内的内存分配器,能够提高内存分配的性能。正好今天试试能不能改善我的代码的性能。
安装的过程如下:
#1、到google下载代码:
cd /home/ahfu/temp
wget https://gperftools.googlecode.com/files/gperftools-2.1.tar.gz

#解压
tar -zxvf google-perftools-1.4.tar.gz
#看看说明
cd google-perftools-1.4
./configure -h
#选择简单的安装
mkdir -p /home/ahfu/temp/tcmalloc
./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal --disable-shared
make && make install
#在makefile里面加入一行就行
LIB = "/home/ahfu/temp/tcmalloc/lib/libtcmalloc_minimal.a"
#  g++ .....   ${LIB}

再进行压测!
大吃一惊!
请求量模拟到28万次/分后,CPU占用还不到20%!!!



<think> 我们正在回答用户关于在Linux系统使用tcmalloc的方法的问题。根据之前的引用和回答,我们需要整理出具体的使用步骤,包括安装、编译链接、环境变量配置等。同时,注意引用来源。 引用信息回顾: - 引用[1]提到TCMalloc比glibc的malloc快,并带有堆栈工具。 - 引用[2]展示了编译时链接TCMalloc静态库的例子:`g++ -O0 -g -pthread test.cc /usr/local/lib/libtcmalloc_and_profiler.a` - 引用[3]提到动态库libtcmalloc.so的路径问题,需要添加其所在文件夹路径,并使用`sudo /sbin/ldconfig`更新。 - 引用[4]说明64位系统需要先安装libunwind库。 因此,使用步骤包括: 1. 安装依赖(64位系统需要libunwind) 2. 安装TCMalloc(通常包含在gperftools中) 3. 编译程序时链接TCMalloc库(静态或动态) 4. 运行程序(可能需要设置环境变量) 具体步骤: ### 1. 安装依赖(仅64位系统) 对于64位Linux系统,需要先安装libunwind库。32位系统无需安装。 ```bash # 下载并解压 wget https://github.com/libunwind/libunwind/releases/download/v1.6.2/libunwind-1.6.2.tar.gz tar -zxvf libunwind-1.6.2.tar.gz cd libunwind-1.6.2 # 编译安装 ./configure make sudo make install ``` ### 2. 安装TCMalloc(通过gperftools) TCMalloc是gperftools的一部分,因此需要安装gperftools。 ```bash # 下载gperftools(以gperftools-2.9.1为例) wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.9.1/gperftools-2.9.1.tar.gz tar -zxvf gperftools-2.9.1.tar.gz cd gperftools-2.9.1 # 编译安装 ./configure make sudo make install ``` 安装后,TCMalloc的库文件(如libtcmalloc.so、libtcmalloc.a)通常位于`/usr/local/lib`目录下。为了让系统能够找到这些库,需要更新动态库链接缓存: ```bash sudo ldconfig ``` 如果库文件不在标准路径,可通过引用[3]的方法添加路径:编辑`/etc/ld.so.conf.d/tcmalloc.conf`,添加库所在目录(例如`/usr/local/lib`),然后运行`sudo ldconfig`。 ### 3. 链接TCMalloc库编译程序 在编译程序时,需要链接TCMalloc库。有两种方式:动态链接和静态链接。 #### 动态链接(推荐) ```bash g++ -O0 -g -pthread your_program.cpp -o your_program -ltcmalloc ``` #### 静态链接 ```bash g++ -O0 -g -pthread your_program.cpp /usr/local/lib/libtcmalloc_and_profiler.a -o your_program ``` 注意:如果使用动态链接,程序运行时需要能够找到`libtcmalloc.so`。若安装后已运行`ldconfig`,则无需额外操作;否则需要设置`LD_LIBRARY_PATH`环境变量: ```bash export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ``` ### 4. 运行程序 编译完成后,直接运行程序即可: ```bash ./your_program ``` ### 5. (可选)环境变量配置 TCMalloc支持通过环境变量调整行为,例如设置线程缓存大小: ```bash export TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=4194304 # 设置线程缓存最大为4MB ``` ### 注意事项 - **动态加载警告**:不要使用`LD_PRELOAD`在程序运行时加载TCMalloc(尤其是已经运行了一段时间的程序),这可能导致内存管理冲突[^2]。 - **性能监控**:TCMalloc内置堆分析工具,可使用`HEAPPROFILE`环境变量生成堆分析文件: ```bash export HEAPPROFILE=/tmp/heapprofile # 设置堆分析文件路径 ./your_program ``` 以上步骤涵盖了在Linux系统使用TCMalloc的主要方法。通过替换默认的内存分配器,可以提升多线程程序的内存分配性能。 §§相关问题§§ 1. 如何验证TCMalloc是否在程序中生效? 2. TCMalloc的堆分析工具如何使用? 3. 在Docker容器中如何使用TCMalloc? </think> ### Linux系统使用TCMalloc的方法 以下是详细的使用步骤,结合编译链接、环境配置和运行监控: --- #### 1. **安装依赖与TCMalloc库** - **64位系统必装依赖**: ```bash # 安装libunwind(64位必需) wget https://github.com/libunwind/libunwind/releases/download/v1.6.2/libunwind-1.6.2.tar.gz tar zxvf libunwind-1.6.2.tar.gz cd libunwind-1.6.2 ./configure && make && sudo make install ``` - **安装TCMalloc**(通过gperftools): ```bash wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.10/gperftools-2.10.tar.gz tar zxvf gperftools-2.10.tar.gz cd gperftools-2.10 ./configure && make && sudo make install ``` - **验证安装**: ```bash ls /usr/local/lib/libtcmalloc* # 确认库文件存在 sudo ldconfig # 更新库缓存[^3] ``` --- #### 2. **编译链接应用程序** - **动态链接**(推荐): ```bash g++ your_app.cpp -o app -ltcmalloc -pthread ``` 运行时自动使用TCMalloc替代glibc的malloc,提升多线程性能[^1]。 - **静态链接**: ```bash g++ your_app.cpp /usr/local/lib/libtcmalloc_and_profiler.a -o app -pthread ``` --- #### 3. **运行时配置** - **环境变量调优**: ```bash # 设置线程缓存大小(默认2MB) export TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=4194304 # 4MB # 启用堆内存分析(定位内存泄漏) export HEAPPROFILE=/tmp/app_heap_profile ./app ``` - **禁止动态加载**: ❌ 避免使用`LD_PRELOAD`加载到已运行程序: ```bash # 错误用法(可能导致崩溃) LD_PRELOAD=/usr/local/lib/libtcmalloc.so ./running_app ``` 仅支持在程序启动时链接[^2]。 --- #### 4. **验证与监控** - **检查是否生效**: ```bash ldd ./app | grep tcmalloc # 查看动态库依赖 ``` 输出应包含`libtcmalloc.so`。 - **分析内存使用**: 运行后生成堆分析文件,使用`pprof`工具: ```bash pprof --text ./app /tmp/app_heap_profile.0001.heap ``` 输出内存分配热点及调用栈[^1]。 --- ### 关键注意事项 1. **架构兼容性**: - 32位系统无需安装libunwind[^4] - 仅适用于Linux/Unix环境 2. **适用场景**: - 多线程服务(如Nginx、Redis) - 需要高频内存分配的程序 3. **性能优势**: 相比glibcmalloc,小内存分配速度提升显著[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值