在InnoDB刚刚被开发的时候,多核CPU还不是这么流行,当时也并没有针对多核CPU优化的内存分配器(memory allocator libraries ),所以InnoDB实现了一个自己的内存分配子系统(mem subsystem),这个子系统是通过单个互斥量(mutex)实现管理的,而这可能会成为一个瓶颈。虽然InnoDB还对OS自带的内存分配管理 (malloc和free)作了一次简单封装,这些管理函数也是通过互斥量的机制实现的,但这并没有解决可能存在的隐患。
从MySQL5.5.X版本开始,用户可以控制InnoDB 是使用自带的内存分配程序,还是使用当前操作系统中现有的更高效的内存分配程序。对此,可通过在 MySQL5.5 选项文件my.cnf 中设置新的系统配置参数 innodb_use_sys_malloc来方便地进行控制。默认设置值为1,表示InnoDB使用操作系统的内存分配程序。
TCMalloc(Thread-Caching Malloc)是Google开发的开源工具——google-perftools中的成员。与标准glibc库中的malloc相比,TCMalloc在内存的分配效率和速度上要高得多,可以在很大程度上提高MySQL服务器在高并发情况下的性能,降低了系统负载。
下面介绍TCMalloc的安装和使用方法。
在安装TCMalloc之前,先要安装关联的软件包libunwind(32位操作系统忽略此步骤),安装命令如下:
# wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99.tar.gz
# tar zxvf libunwind-0.99.tar.gz
# cd libunwind-0.99
# CFLAGS=-fPIC ./configure --enable-shared
# make CFLAGS=-fPIC
# make CFLAGS=-fPIC install
下面开始正式安装google-perftools:
# wget http://lnamp-web-server.googlecode.com/files/google-perftools-1.7.tar.gz
# tar zvxf google-perftools-1.7.tar.gz
# cd google-perftools-1.7
# ./configure
# make && make install
# vi /usr/local/MySQL/bin/MySQLd_safe
然后在# executing MySQLd_safe的下一行加入以下内容:
export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
最后重启MySQL服务:
# service MySQLd restart
下面使用lsof命令来查看一下TCMalloc是否生效:
# lsof -n |grep tcmalloc
如果可以显示类似以下的信息,则表明MySQL已经成功加载TCMalloc。
MySQLd 13093 MySQL mem REG 253,0
2070229 936032 /usr/local/lib/libtcmalloc.so.0.1.0
下面将用Sysbench进行压力测试,了解两种内存管理模式的性能对比情况。
由于是虚拟机,Sysbench参数设置得很小:
#!/bin/bash
i=1
while true
do
while [ $i -le 1000 ]
do
/usr/local/bin/Sysbench --test=oltp --MySQL-table-engine=innodb --oltp-table-size=10000 --max-requests=100 --num-threads=6 --
MySQL-host=192.168.110.140 --MySQL-port=3306 --MySQL-user=admin --MySQL-password=123456 --MySQL-db=test --MySQL-socket=/tmp/
MySQL.sock run >> semi_replication.txt
let i++
done
break
done
说明一下,测试系统为Red Hat Enterprise Linux Server release 6.0 (Santiago);内核为2.6.32-71.el6.x86_64。来看一下压力测试结果,先说明一下,在图1-4和图1-5中:
15:20~15:35使用的是InnoDB自带的内存分配程序。
15:40~16:00使用的是谷歌的TCMalloc内存分配程序。
16:20~16:40使用的是系统自带的Malloc内存分配程序。
从结果上看,使用谷歌的TCMalloc内存分配程序对系统的压力相对要小一些。当然如果是真正的物理机,性能的差异会更明显,有兴趣的读者可以一试。
关于innodb_use_sys_malloc参数的介绍,请参见MySQL5.5手册: