随着系统用户数的不断增加,MySql数据库的CPU 经常达到99%。
业务部门投诉不断增加,严重影响了系统的正常运行,必须马上实施优化。
数据库:
从MySql的show processlist来看,发现有些SQL执行的比较频繁。
这些SQL的共同点是:
1.都使用了distinct,count操作。
2.都访问了一个共同的视图。
3.这个视图中还嵌套着另外一个视图。
4.这些SQL大多相同,只是传递的参数不同而已。
操作系统:
从nmon对操作系统的监控结果来看,系统的瓶颈主要集中在cpu上。
top 的平均负载来看最近系统的负载情况:
load average: 30.00, 32.83, 35.47
vmstat 看r队列一直持续非常高。
跟开发人员沟通过提出了两种优化方案。
1.修改程序,优化SQL.
2.升级硬件(原数据库跑在虚拟机上,只有4颗cpu)
由于开发人员比较紧张,领导同意先升级硬件观察一下。
数据库升级到一个12颗cpu的物理机,内存增大了3倍,cpu照样99%。
硬件升级方案失败。
业务部门投诉不断增多,领导同意优化SQL。
那个频繁被访问的视图所涉及的业务逻辑设计有问题,短时间内无法进行优化。
由于视图所涉及的数据很少有更新。与开发人员沟通后,决定把视图变成一个物理表。
物理表数据的更新由trigger来触发。
这样调整后,数据库的cpu立刻降到20%左右。
经过几天的观察,系统的用户数量比调整前略有增加,但cpu一直稳定在8%到20%之间。
并且没有在收到业务部门的投诉。至此,本次优化宣告结束。