读书频道 > 网站 > 网页设计 > MySQL管理之道:性能调优、高可用与监控
1.1.9 在InnoDB中可选择使用内存分配程序
14-02-20    奋斗的小年轻
收藏    我要投稿   
本书由资深MySQL专家撰写,以最新的MySQL版本为基础,以构建高性能MySQL服务器为核心,从故障诊断、表设计、SQL优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、MySQL高可用集群搭建与管理、MySQL服立即去当当网订购

在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手册:

 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站