Skip to content

性能分析思路

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

Clone this wiki locally