作者:王祥
爱可生 DBA 团队成员,主要负责 MySQL 故障处理和性能优化。对技术执着,为客户负责。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
–
背景信息
业务监控发现交易的平均响应时间比之前慢了近一倍,需要排查一下数据库是不是响应慢了。生产MySQL版本为8.0.18,一主3从半同步复制。
故障分析
首先对比查看了交易正常时段与出现异常的时段各项监控指标(cpu、qps、tps、磁盘IO等)都未发现明显的变化。接下来查看slow log发现了较多的慢SQL,而且是普通的insert语句,执行时长超过1秒。进一步观察对比发现,每次insert慢都是出现在同一秒,insert慢语句条数基本在30条左右,而且出现的间隔都是两分钟或两分钟的倍数。根据这个规律第一感觉是不是定时任务引起的问题。经过对定时任务的排查最终定位到监控脚本,监控脚本为两分钟执行一次。接下来需要排查一下,具体是哪部分导致insert慢。为了快速复现问题,直接在一个从库上使用mysqlslap进行压测。从业务那得知问题insert语句每秒会有60-80次的写入量,压测语句如下:
mysqlslap -h127.0.0.1 -uroot -p --concurrency=80 --iterations=10 --create-schema=userdb --query=/root/test.sql --engine=innodb --number-of-queries=50000
#test.sql
insert into userdb.ps (clo1, clo2, clo3, clo4, clo4, clo5, clo6) values (substring

当业务监控显示交易响应时间变慢,通过对比监控指标和分析slowlog,发现大量慢SQL集中在特定时间点。经排查,定时任务中的监控脚本使用show processlist导致了全局互斥锁,影响了insert操作。MySQL 8.0.22引入的performance_schema_show_processlist参数可以避免这个问题,通过设置该参数为on,使用Performance Schema的processlist来提升性能。
最低0.47元/天 解锁文章
1209

被折叠的 条评论
为什么被折叠?



