mysql数据库cpu占比过高原因与解决方案
服务环境:
服务器8c16g,部署单体服务,mysql,redis等
问题描述
因商务推广,软件使用人数激增,服务器cpu占比100%,导致服务崩溃。
问题原因
因原程序数据库连接数远小于并发量,导致大量活跃连接连接到数据库中,致使数据库cpu占比过高。
排查记录
1.在发现服务器cpu爆掉后,先针对服务器进行排查,发现服务器连接数超标,远超预期值,带宽使用过高。
此时怀疑遭受攻击,咨询阿里云工程师后,回复服务器无植入木马,无后台程序。
2.通过对服务器中运行线程进行排查后,锁定数据库占用资源过高,此时将数据库迁入阿里云RDS4c8g,完成迁入后,RDScpu占用与活跃连接数过高。
3.此时排查到,某接口大量非正常调用,该接口调用后台查询功能
此时针对该接口进行限制,通过ng对该接口进行封禁,禁止其调用至后台。完成封禁后,RDScpu占用依旧100%。
4.与客户沟通时发现,客户进行了商务推广,通过oss后台探查到,生产apk包当日下载量过万,明确高并发实时,结束对服务器遭受攻击怀疑。
5.提交RDS工单,经工程师反馈,RDS活跃连接过高,正常活跃连接应为核心数*3(4c8gRDS正常活跃连接应为12)
此时发现,RDS的内存等占比并不高,只有cpu占比100%
6.明确RDScpu问题,查看程序当前连接数,发现当前服务连接上限为1000,此时将连接数增加至5000。
但cpu占比依旧100%。
7.将RDS检索出的慢查询与原数据库进行对比,原数据库1s出结果,RDS需要几十秒,依旧怀疑数据库连接问题
此时缩短超时时长至3s。此时业务可以正常运行,RDScpu压力明显下降,但导致有部分的sql超时
8.此时重新查询慢sql,针对性改进了几个异常sql,并逐渐调试连接超时时长至6s
此时业务正常运行,RDS慢sql查询清零。