一个朋友的网站,原来遇到
mysql
性能不足,产生
swap
颠簸问题,后来使用
tcmalloc
解决了。观察了一个多星期,效果不错。
下面转载是他的文章。
之前,一直困恼很久的
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 的图:
问题是:网站访问量不高,高峰时并发数在 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