注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风轻扬

活着就是为了追求幸福

 
 
 

日志

 
 
关于我

关注互联网应用架构、分布式与海量数据处理技术、云计算、数据库技术

网易考拉推荐

MySQL在多CPU机器上的并发性能可望于近期获重大提升  

2007-05-12 12:34:43|  分类: MySQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
MySQL(这里特指使用InnoDB存储引擎的MySQL)在多CPU机器上的性能问题一直为人诟病。根据Tweakers.net的评测,在单CPU机器上,MySQL的性能是PostgreSQL的1.5倍,但在双CPU的机器上MySQL性能就已经跟PostgreSQL相差无几了。在拥有更多的CPU的服务器上,MySQL的性能与双CPU相比即不再增加,到8个CPU时还反而下降。

但这一现象可望在近期得到改变。在上个月举行的MySQL用户大会上,NTT COMWARE公司的Yasufumi Kinoshita公布了他们针对MySQL并发性能的研究成果,其所提供的补丁能够大幅提高MySQL在多CPU机器上的性能。

Kinoshita分别仔细研究了以写操作为主的TPC-C应用和以读操作为主的TPC-W应用(Kinoshita用的DBT-1是一个开源的TPC-W实现)的性能,发现并解决了几个重大的性能瓶颈。

对于以写操作为主的TPC-C应用,第一个性能瓶颈是buffer的mutex。改进之前的MySQL使用一个全局的mutex保护buffer,访问各个block、调整LRU链表等所有buffer相关操作都要先加上这个mutex,由此导致严重的锁冲突。改进后MySQL对每个block都使用一个mutex,这样访问不同的block即不会相互冲突。这一问题先前已经被MySQL技术专家Peter Zaitsev发现,并在5.0.30版本中得到解决(见Bug #15815),我先前也提到过。但Kinoshita发现单独修正这一问题并不能使TPC-C获得性能上的提升,还需要解决另一个问题,即buffer刷写和insert buffer合并的优先级问题。目前MySQL在调度将buffer中的脏页刷出到磁盘和将insert buffer合并到索引时优先级过低,不能即时为buffer和insert buffer腾出空间,导致不定期出现大量线程在申请buffer和insert buffer时被阻塞的现象。

对于以读操作为主的TPC-W应用,最大的瓶颈是Adaptive Hash Index的并发问题。Adaptive Hash Index应当说是InnoDB中的一个非常优秀的设计。所谓Adaptive Hash Index是指系统会分析应用对索引的访问模式,有选择性的自动建立内存中的哈希索引,提高索引访问的效率。但MySQL在实现这一特性时并没有充分考虑到并发性能问题。整个Adaptive Hash Index使用一个mutex保护,这里的问题是mutex(指pthread_mutex)并不是一种非常高效的同步机制,对于加读锁也要加mutex开销最大。为解决这一问题Yasufumi使用汇编语言中的lock指令重写了rwlock。第二个瓶颈是B+树检索latch用得过多,所有检索Adaptive Hash Index和buffer读写操作都要加这个latch。Kinoshita对B+树索引部分代码进行了大量修改,主要是使用一个latch数组来降低冲突,某些地方使用原子变量来代替latch等技术来解决这一问题。

实验表明采用Kinoshita的这些修改后MySQL性能提升相当明显。以TPC-W为例,下面图1是优化前的结果,图2是优化后的结果。优化后的性能优势非常明显,并且已经接近了线性增长的理想情况。
MySQL在多CPU机器上的并发性能可望于近期获重大提升 - 风轻扬 - 风轻扬

MySQL在多CPU机器上的并发性能可望于近期获重大提升 - 风轻扬 - 风轻扬
目前Kinoshita已经将Adaptive Hash Index的patch提交到MySQL的bugzilla(Bug #26442)中,但目前还没有被MySQL官方接受到主分支中。

BTW: 从图中的结果看即使优化后MySQL在线程数多时性能仍有所下降,这也是影响MySQL性能的一个重大问题,这方面还有更多的工作要做。

注: 本文主要内容来源于Kinoshita在MySQL 2007用户大会上的ppt,在这此下载。
  评论这张
 
阅读(2790)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017