【原】Qone Mysql性能优化-实战篇

Keywords:Mysql,性能优化,slow query,连接占满,Qone

 

前一段有客户反馈Qone系统的性能问题,并发用户不多,也就是20个左右,但是Qone服务器就down掉了,连登陆页面都无法访问。

 

按理说20多个用户不至于性能差到如此地步,我有幸负责查找这次的性能问题原因,希望可以找到真正的原因。

 

通过查找大量资料,包括tomcat调优、mysql调优、jvm监控等方式,最终发现,最大的性能瓶颈在数据库访问效率上。

 

先看下调优之前的情况:

测试环境为:60用户并发访问Qone,Qone程序最大开启150连接,初始连接80,mysql数据库最大开启240连接,数据库使用Qone的默认数据库,没有进行任何优化。
从下图可以看出,数据库的大部分连接被长时间占用,并且处于sending data状态,从图上看有的连接已经占用了48秒,并且还在继续被占用,迟迟无法释放。


【原】Qone Mysql性能优化-实战篇_第1张图片

优化前的数据库性能

 

经过一段时间,被占用的连接无法释放,程序申请新的连接,数据库连接数很快上升到117个。


【原】Qone Mysql性能优化-实战篇_第2张图片

最终由于所有连接都无法释放,数据库性能急剧下降,Qone程序配置的150个连接都被占满(图中157个连接,有7个为通过非Qone方式访问数据库的连接),Qone程序已经无法通过浏览器访问,首页无法打开,数据库已经基本无法访问。


【原】Qone Mysql性能优化-实战篇_第3张图片

下面是loadrunner的截图,从结果看,执行基本全部失败,成功的只有62次,平均响应时间tasklist15.287s(由于后期都是失败,这个数据只统计成功的平均值,需要综合看),taskreport100.216s。


【原】Qone Mysql性能优化-实战篇_第4张图片
 未优化前性能情况

 

对于程序快速占满数据库连接的情况,是很严重的异常,通过分析和大量实验,最终确定是由于单个连接占用时间过长导致数据库性能急剧下降。

 

调优后的情况:

基于以上结果,从降低单个连接的占用时间入手。Qone的数据库访问,在程序上修改起来比较麻烦,因此我们只关注slow query,通过对数据库增加索引的方式来提升slow query的效率。如何开启mysql的slowq query log自己搜索一下吧。

如何优化slow query的文章很多,这里主要是使用mysql自带的explain对sql语句进行分析,然后通过在相应字段上增加索引以提升查询性能。

 

下面通过检测Mysql数据库的slow query,仅在loadrunner测试用例执行的sql语句涉及的表上进行优化,在bsemployee表的userlogin_id列上加了normal索引,在taskDayReport表的userId,taskId,submitDate均增加normal索引。
调优之后,同样的数据量,60的并发用户访问Qone程序,数据库连接,qone程序连接设置与调优前一样,通过浏览器访问Qone程序,可以打开各页面,响应速度基本可以接受,后台连接占用时间较短,且很多连接还处于sleep未占用状态。

【原】Qone Mysql性能优化-实战篇_第5张图片
 调优之后的连接占用情况

从截图可用看出,大部分连接执行时间基本都在0s,部分连接执行2s,大部分连接还处于sleep可用状态,数据库连接池中的初始连接还未被占满。
从loadrunner执行结果看,60的用户全部登陆成功,所有请求全部成功执行,失败请求为0。Tasklist平均响应时间24.265s,taskreport平均响应时间10.156。


【原】Qone Mysql性能优化-实战篇_第6张图片

 

从测试结果看,这次调优基本上已经可以达到目的,用户后来也反馈没有再出现此性能问题,但Qone性能调优还有很多事情要做,如程序中数据库操作的sql或hql语句优化,数据库结构及索引优化等。

 

总结:从测试情况看,降低每一个数据库连接的占用时间是关键。否则就算并发量很小,但连接被占用时间很长,也会使数据库性能急剧下降。

你可能感兴趣的:(数据结构,sql,mysql,浏览器,loadrunner)