-
Notifications
You must be signed in to change notification settings - Fork 111
性能分析思路
xiaoboluo768 edited this page Jun 8, 2020
·
2 revisions
-
首先,需要一个能够重复操作的案例,例如:一个性能低下的SQL语句,在重复操作之前,你需要打开所有的instruments(不要禁用任何instruments),在所有的instruments数据都采集到之后,再根据你的查询分析需要使用select ...where形式来过滤出相关的信息
- 当然,对于你确定不需要收集的信息,可以在重复操作案例前仅用掉,例如:如果你确定某个IO性能问题跟myisam引擎无关(你的表是innodb表),那么可以把myisam引擎的相关instruments禁用掉
-
当案例重复操作之后,首先查看events_waits_history_long表,并逐步过滤掉一些不需要的信息(使用select ... where形式过滤出需要的信息),然后慢慢地你需要的信息就会浮出水面
-
一旦确定了问题的根本原因,或者说排除了所有的不可能,剩下的就是最有可能的原因了,现在,你可以按照如下方面进行调整
- 调整server配置参数,如缓存大小,内存参数等
- 调整表结构,如添加索引
- 改写SQL
- 改写源代码(仅适用于mysql 源码开发人员)
- 对于以上调整项,没一项调整之后都重复操作一下案例,观察是否有优化效果
-
分析性能瓶颈和死锁时,events_waits_current 表结合mutex_instances、rwlock_instances表中的相关字段可以很好地协助分析,例如:mutex_instances.LOCKED_BY_THREAD_ID和rwlock_instances.WRITE_LOCKED_BY_THREAD_ID等
- 例如,你在某个会话执行某个SQL时(假设被阻塞的是线程 1),发现被阻塞,假设你这个语句通过show processlist发现正在等待一个互斥锁
- 你可以从events_waits_current表中,通过events_waits_current.OBJECT_INSTANCE_BEGIN字段查看当前哪个线程持有这个互斥锁,假设这个互斥锁是mutex A
- 从mutex_instances 表中,通过SELECT * FROM mutex_instances WHERE OBJECT_INSTANCE_BEGIN = mutex_A;语句你可以查看到这个互斥锁被哪些线程持有(线程ID:mutex_instances.LOCKED_BY_THREAD_ID.)
- 假设是线程2持有这个互斥锁mutex A,现在,再次查询events_waits_current,通过SELECT * FROM events_waits_current WHERE THREAD_ID = thread_2;,查看线程2正在做什么事情,此时,你就可以发现线程1为什么会被阻塞了
-
参考链接:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-examples.html
上一篇: performance_schema 内存分配模型 | 下一篇: 相关system variables和status variables
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!