Mysql服务器线程阻塞分析原创
问题反馈
压测sql的时候发现响应时间很长。项目架构是:openresty(nginx+lua)+MySQL
压测50个并发线程,tsp:823条/s,响应时间:0.26s,mysql服务器的cpu使用率很高,集中在内核空间。si%使用率达到10%以上,负载达到14,如下图
综合分析,内核利用率高,负载高,软中断高,说明mysql的线程拿到了cpu,一直在内核做数据读写,并且产生了阻塞,后续线程无法获取cpu
问题分析
先给一棒子,直接打印mysql的事物。
SHOW PROCESSLIST;
可以看到有一些线程状态显示为 wainting for hander commit,具体的操作是insert日志
说明mysql线程的队列确实有阻塞了,具体原因需要继续分析
select * from performance_schema.events_statements_current; 查询执行失败的语句
接下来需要查看一下当前运行的线程,看看线程在执行什么事物
SHOW PROCESSLIST;
大量的instert异常,而且都是日志读写的操作。再结合之前的wainting for hander commit
怀疑是mysql的磁盘满了,需要检查一下block和innode
磁盘确实剩余的不多,不过还没到打满的地步。接下来需要检查一下mysql的binlog日志空间
可以看到mysql的日志空间全部打满,所以insert操作抛异常,接着导致后续的事务阻塞,出现大量的wainting for hander commit。
因为是日志读写,所以cpu的内核空间利用率很高,并且软中断很高
因为线程阻塞,所以负载很高,后续线程拿不到cpu