之前,一直困恼很久的MySQL的问题因为有了tcmalloc后得以解决。
问题是:网站访问量不高,高峰时并发数在300-400之间。CPU比较高,在30-80%之间波动得厉害,使用top命令可以看到是mysql进程导致,同时用iostat和sar查看iowait值很高在20-30之间。
但是系统还可以稳定运行,然后周期性的出现swap分区占用率攀升,直接导致应用程序无法连接数据库。不知道这是不是mysql的swap颠簸的问题。没解决办法的时候只好经常监控内存的使用情况,碰到swap开始攀升的时候重启MySQL服务。一般这个周期在一个星期左右。
后来在网上搜到了tcmalloc,说是这个东西可以让MySQL在高并发下性能也很稳定,同时也说了MySQL这个问题是因为malloc内存分配函数的bug,这个bug会使高并发的MySQL性能急剧下降。
决定试试。
系统是64位的RedHat Enterprise Linux 5.0 。在64位系统下需要安装另外一个包libunwind。然后下载tcmalloc包,按默认方式编译和安装成功后在 mysqld_safe 中加入
LD_PRELOAD="/usr/local/lib/libtcmalloc.so"
重启MySQL。没有办法可以验证tcmalloc是否起效,只能再继续监控系统的运行状况。
经过一个多礼拜了,你可以看看下面一个抓自mrtg的图:
上面两个图中,第一个是CPU的图,第二个是内存的图。可以看出从换上tcmalloc后,CPU占用率下降非常明显,原来一直维持在30%左右,现在只占不到10%。而内存方面,原来物理内存一直占用100%,swap占用率波动得很厉害,下降点一般是重启MySQL后导致的,而换上tcmalloc后,内存维持在80-90%之间,而swap占用率就非常稳定,可以按零计。
而且已经持续了一个多礼拜了。可以说效果相当相当的明显,非常令人满意。再也不用老去盯着mrtg看了。当然这是我的机器上现实的情况,不知道其他系统怎样。
libunwind: http://www.nongnu.org/libunwind/
tcmalloc: http://goog-perftools.sourceforge.net/doc/tcmalloc.html
详细的安装步骤:
#tar zxvf libunwind-0.98.6.tar.gz
#cd libunwind-0.98.6
#./configure
#make
#make install
#tar zxvf google-perftools-0.94.1.tar.gz
#cd google*
#./configure
#make
#make install
打开 mysqld_safe 脚本 (默认在/usr/bin/mysqld_safe)
在此脚本文件开始加入
LD_PRELOAD="/usr/local/lib/libtcmalloc.so"
#service mysql restart
分享到:
相关推荐
如果输出信息显示`mysqld`进程加载了`libtcmalloc.so`,则说明TCMalloc已经生效并正在被MySQL使用。 整合TCMalloc到MySQL可以带来诸多性能优势,例如更快的内存分配速度、更少的系统资源消耗以及更好的并发处理能力...
在本文中,我们将介绍如何使用tcmalloc来排查内存泄漏的方法。 安装gperftools 首先,我们需要安装gperftools这个工具包,可以使用以下命令来安装: wget ...
**Tcmalloc-v2.10:深入理解内存管理和内存泄漏** Tcmalloc,全称为“Thread-Caching Malloc”,是Google开发的一款高效、优化的内存分配器,它被包含在...了解并正确使用tcmalloc,可以显著提升应用的性能和稳定性。
MySQL 服务器内核和系统相关优化手册 这是一个 MySQL 服务器内核和系统相关优化手册,旨在帮助 MySQL 数据库管理员和开发者了解 MySQL 服务器的性能优化技巧和方法。本手册涵盖了 MySQL 服务器的架构、系统瓶颈定位...
4. **替换默认内存分配器**:为了使用Tcmalloc,你需要在程序启动时调用`google::InitGoogleLogging()`和`tcmalloc::TcmallocPageHeap::Init()`函数来初始化Tcmalloc。 5. **测试与优化**:编译并运行项目,检查...
2. **页级缓存(Page Heap)**: 对于较大的内存分配,Tcmalloc使用页级缓存,将内存分配的粒度提升到页级别,减少系统调用的次数。 3. **空闲链表管理**: 当内存块被释放后,Tcmalloc会尝试将其归还给相应的线程局部...
TCMalloc使用线程本地缓存来管理内存,每个线程都有自己的小堆,可以快速响应线程的内存分配请求。TCMalloc通过减少对中央堆的争用,从而降低了内存分配的延迟。 然而,TCMalloc原本设计并未针对NUMA架构进行优化,...
2. **静态链接**:若选择静态链接,需要将`tcmalloc.lib`文件添加到项目的链接器输入中,这样编译后的程序就不依赖外部的dll文件。但是,由于静态链接,程序体积会增加,并且不会享受到tcmalloc库的单独更新。 **...
要使应用程序使用TCMalloc进行内存分配,需要通过设置环境变量`LD_PRELOAD`来实现。具体操作步骤如下: 1. **定位TCMalloc库文件**:首先确认TCMalloc库文件的具体位置。对于已经安装了`libtcmalloc-minimal4`的...
配置完成后,使用`make`进行编译,然后使用`make install`进行安装。如果一切顺利,tcmalloc的相关库文件将会被安装到你指定的位置。 在`config`文件中,通常包含了编译选项和配置设置,如CFLAGS、CXXFLAGS、...
安装tcmalloc所需的源代码,和完整编译安装应用过程。 unzip tcmalloc.zip tar -zxvf gperftools-2.1.tar.gz cd gperftools-2.1 ./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-...
These tools are for use by developers so that they can create more robust applications. Especially of use to those developing multi-... Includes TCMalloc, heap-checker, heap-profiler and cpu-profiler.
These tools are for use by developers so that they can create more robust applications. Especially of use to those developing multi-... Includes TCMalloc, heap-checker, heap-profiler and cpu-profiler.
这个tcmalloc很出名了,是google出的内存管理模块,比传统模块控制更合理,能应付更高的并发,而且也更稳定. 不过这个模块不是系统自带的,没有原生安装,所以需要手动去安装操作,稍微有点麻烦.这个模块包含在google封装...
4. **数据库支持**:如libmySQL,这是MySQL客户端连接库,允许其他程序与MySQL服务器交互。 5. **其他依赖**:可能还包括如jemalloc或tcmalloc这样的内存分配器,以提高性能;还有可能包含用于时间同步的NTP服务,...
本项目为基于C++语言的TCMalloc内存优化模块的设计...TCMalloc(google-perftools)旨在优化多线程C++应用的内存分配,相比glibc 2.3的malloc具有更高的性能,特别适用于MySQL等数据库在高并发环境下的内存稳定性需求。
在进阶部分,教程演示了如何将MySQL与Apache服务器结合使用。此外,文档还详细列出了MySQL中使用的第三方组件的许可证信息,这包括但不限于Ant-Contrib许可证,ANTLR3许可证,Boost库许可证,c3p0 JDBC库许可证,DTO...
例如,如果发现某个查询在MySQL中消耗了大量内存,libunwind可以帮助确定是哪个函数调用导致了这个问题,而tcmalloc则可以提供内存分配的详细统计,帮助找出内存使用效率低下的原因。 在实际部署中,MySQL和Nginx...
项目简介:该项目实现了一个简易的高并发内存池框架,将内存池设计为thread cache、central cache、page cache三层架构,从而实现高效的多线程内存管理。 核心技术:链表、哈希桶、操作系统内存管理、单例模式的设计...