性能文章>Mysql服务器线程阻塞分析>

Mysql服务器线程阻塞分析原创

1年前
356247

问题反馈

压测sql的时候发现响应时间很长。项目架构是:openresty(nginx+lua)+MySQL
压测50个并发线程,tsp:823条/s,响应时间:0.26s,mysql服务器的cpu使用率很高,集中在内核空间。si%使用率达到10%以上,负载达到14,如下图
image.png
综合分析,内核利用率高,负载高,软中断高,说明mysql的线程拿到了cpu,一直在内核做数据读写,并且产生了阻塞,后续线程无法获取cpu

问题分析

先给一棒子,直接打印mysql的事物。
SHOW PROCESSLIST;
image.png
可以看到有一些线程状态显示为 wainting for hander commit,具体的操作是insert日志
说明mysql线程的队列确实有阻塞了,具体原因需要继续分析
select * from performance_schema.events_statements_current; 查询执行失败的语句
image.png

接下来需要查看一下当前运行的线程,看看线程在执行什么事物
SHOW PROCESSLIST;
image.png
大量的instert异常,而且都是日志读写的操作。再结合之前的wainting for hander commit
怀疑是mysql的磁盘满了,需要检查一下block和innode
image.png

磁盘确实剩余的不多,不过还没到打满的地步。接下来需要检查一下mysql的binlog日志空间
image.png
可以看到mysql的日志空间全部打满,所以insert操作抛异常,接着导致后续的事务阻塞,出现大量的wainting for hander commit。

因为是日志读写,所以cpu的内核空间利用率很高,并且软中断很高
因为线程阻塞,所以负载很高,后续线程拿不到cpu

点赞收藏
飞天小子

13软件测试,10年性能测试,5年性能培训,10万字性能博主,项目经理,微信uhz2008

请先登录,查看4条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步
7
4