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

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

1年前
318147

问题反馈

压测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条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

还傻傻搞不懂MySQL事务隔离级别么(图文并茂,保证你懂!)

还傻傻搞不懂MySQL事务隔离级别么(图文并茂,保证你懂!)

为什么需要插入意向锁?

为什么需要插入意向锁?

MySQL 不一样的 NULL

MySQL 不一样的 NULL

美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制)

美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制)

hive 行转列,列转行一些函数总结

hive 行转列,列转行一些函数总结

记一次线上问题 → Deadlock 的分析与优化

记一次线上问题 → Deadlock 的分析与优化

7
4