论坛的数据库…………
不说也罢,直接切入正题。
论坛数据库机器很老
CPU:Intel Pentium III Xeon 700 2MB CPU
MEM:1G
[size=medium]之前有调整过my.cnf的配置,跑了许久,还算稳定。因为不是我装的,configure的参数不知道有没有优化,但是内存小我觉得是比较致命的缺点,而且挂的数据库比较多,并发一高,内存更是严重不足。想了很多缓解压力的办法,前段时间在[url=http://blog.s135.com/post/349/]张晏[/url]大大的blog里发现篇博客,了解到TCMalloc可以提高mysql在高并发下的性能。又在网上搜索了许多资料,觉得可行,而且很符合我们的实际情况。[/size]
[size=medium]什么是TCMalloc? [/size]
TCMalloc意思是线程缓存的malloc。
TCMalloc(Thread-Caching Malloc)是google开发的开源工具──“google-perftools”中的成员。与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高服务器在高并发情况下的性能,降低系统负载。
别人翻译的TCMalloc介绍:[url]http://shiningray.cn/tcmalloc-thread-caching-malloc.html[/url]
于是乎,今天又做了优化,在此简略记录一下数据,以便日后对比。
开机14天
| Key_read_requests | 2088601666 |
| Key_reads | 1685046 |
Key_read_requests/Key_reads=1240
1240个请求只有1个从硬盘读取,其他命中缓存。之前有开机时间长的一次看的数据是2000。
[size=medium]TCMalloc安装[/size]
[color=red]编译MYSQL时,configure时不能有这一个参数 with-mysqld-ldflags=-all-static,否则加载失败。[/color]
[color=red]64位操作系统请先安装libunwind库,32位操作系统不要安装。[/color][url=http://download.savannah.gnu.org/releases/libunwind/]libunwind库[/url]为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。
安装[url=http://code.google.com/p/google-perftools/downloads/list]google-perftools[/url]
设置并更新动态连接库
配置mysql启动脚本
重启mysql后查看是否加载成功
[size=medium]补充[/size]
这里有个别人测试的结果:[url]http://www.javayou.com/diary/18368[/url]
有人测试成功32位系统静态编译TCMalloc到Mysql,方法是:
要执行的预编译指令
在configure时要加入的参数
这个我没试过,静态编译虽然效率更高,但是感觉兼容性、稳定性会有问题。
[size=medium]2009.10.11[/size]
不说也罢,直接切入正题。
论坛数据库机器很老
CPU:Intel Pentium III Xeon 700 2MB CPU
MEM:1G
[size=medium]之前有调整过my.cnf的配置,跑了许久,还算稳定。因为不是我装的,configure的参数不知道有没有优化,但是内存小我觉得是比较致命的缺点,而且挂的数据库比较多,并发一高,内存更是严重不足。想了很多缓解压力的办法,前段时间在[url=http://blog.s135.com/post/349/]张晏[/url]大大的blog里发现篇博客,了解到TCMalloc可以提高mysql在高并发下的性能。又在网上搜索了许多资料,觉得可行,而且很符合我们的实际情况。[/size]
[size=medium]什么是TCMalloc? [/size]
TCMalloc意思是线程缓存的malloc。
TCMalloc(Thread-Caching Malloc)是google开发的开源工具──“google-perftools”中的成员。与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高服务器在高并发情况下的性能,降低系统负载。
别人翻译的TCMalloc介绍:[url]http://shiningray.cn/tcmalloc-thread-caching-malloc.html[/url]
于是乎,今天又做了优化,在此简略记录一下数据,以便日后对比。
开机14天
| Key_read_requests | 2088601666 |
| Key_reads | 1685046 |
Key_read_requests/Key_reads=1240
1240个请求只有1个从硬盘读取,其他命中缓存。之前有开机时间长的一次看的数据是2000。
[size=medium]TCMalloc安装[/size]
[color=red]编译MYSQL时,configure时不能有这一个参数 with-mysqld-ldflags=-all-static,否则加载失败。[/color]
[color=red]64位操作系统请先安装libunwind库,32位操作系统不要安装。[/color][url=http://download.savannah.gnu.org/releases/libunwind/]libunwind库[/url]为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
sudo make CFLAGS=-fPIC install
安装[url=http://code.google.com/p/google-perftools/downloads/list]google-perftools[/url]
./configure
make
sudo make install
设置并更新动态连接库
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig
配置mysql启动脚本
sudo vi /usr/local/web/mysql/bin/mysqld_safe
#在:# executing mysqld_safe下加入以下
export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
重启mysql后查看是否加载成功
lsof -n | grep tcmalloc
#mysqld 11046 mysql mem REG 72,1 1808415 4693827 /usr/local/lib/libtcmalloc.so.0.0.0
[size=medium]补充[/size]
这里有个别人测试的结果:[url]http://www.javayou.com/diary/18368[/url]
有人测试成功32位系统静态编译TCMalloc到Mysql,方法是:
要执行的预编译指令
CFLAGS="-O3"
CXX=g++
CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti"
在configure时要加入的参数
--with-mysqld-ldflags=-all-static
--with-mysqld-ldflags=-ltcmalloc
#网上都写成了--with-mysqld-ldflags="-all-static -ltcmalloc",结果make错误,分开写没问题
--enable-thread-safe-client
#有人说必须要
这个我没试过,静态编译虽然效率更高,但是感觉兼容性、稳定性会有问题。
[size=medium]2009.10.11[/size]