Skip to content

mutex_instances

xiaoboluo768 edited this page Jun 8, 2020 · 2 revisions
  • mutex_instances表列出了server执行mutex instruments时performance_schema所见的所有互斥量。互斥是在代码中使用的一种同步机制,以强制在给定时间内只有一个线程可以访问某些公共资源。可以认为mutex保护着这些公共资源不被随意抢占

  • 当在server中同时执行的两个线程(例如,同时执行查询的两个用户会话)需要访问相同的资源(例如:文件、缓冲区或某些数据)时,这两个线程相互竞争,因此第一个成功获取到互斥体的查询将会阻塞其他会话的查询,直到成功获取到互斥体的会话执行完成并释放掉这个互斥体,其他会话的查询才能够被执行

  • 需要持有互斥体的工作负载可以被认为是处于一个关键位置的工作,多个查询可能需要以序列化的方式(一次一个串行)执行这个关键部分,但这可能是一个潜在的性能瓶颈

  • mutex_instances表字段含义如下:

    • NAME:与互斥体关联的instruments名称
    • OBJECT_INSTANCE_BEGIN:mutex instruments实例的内存地址
    • LOCKED_BY_THREAD_ID:当一个线程当前持有一个互斥锁定时,LOCKED_BY_THREAD_ID列显示持有线程的THREAD_ID,如果没有被任何线程持有,则该列值为NULL
  • mutex_instances表不允许使用TRUNCATE TABLE语句

  • 对于代码中的每个互斥体,performance_schema提供了以下信息:

    • setup_instruments表列出了instruments名称,这些互斥体都带有wait/synch/mutex/前缀
    • 当server中一些代码创建了一个互斥量时,在mutex_instances表中会添加一行对应的互斥体信息(除非无法再创建mutex instruments instance就不会添加行)。OBJECT_INSTANCE_BEGIN列值是互斥体的唯一标识属性
    • 当一个线程尝试获取已经被某个线程持有的互斥体时,在events_waits_current表中会显示尝试获取这个互斥体的线程相关等待事件信息,显示它正在等待的mutex 类别(在EVENT_NAME列中可以看到),并显示正在等待的mutex instance(在OBJECT_INSTANCE_BEGIN列中可以看到)
    • 当线程成功锁定(持有)互斥体时:
      • events_waits_current表中可以查看到当前正在等待互斥体的线程时间信息(例如:TIMER_WAIT列表示已经等待的时间)
      • 已完成的等待事件将添加到events_waits_history和events_waits_history_long表中
      • mutex_instances表中的THREAD_ID列显示该互斥体现在被哪个线程持有
    • 当持有互斥体的线程释放互斥体时,mutex_instances表中对应互斥体行的THREAD_ID列被修改为NULL
    • 当互斥体被销毁时,从mutex_instances表中删除相应的互斥体行
  • 通过对以下两个表执行查询,可以实现对应用程序的监控或DBA可以检测到涉及互斥体的线程之间的瓶颈或死锁信息(events_waits_current可以查看到当前正在等待互斥体的线程信息,mutex_instances可以查看到当前某个互斥体被哪个线程持有)

  • 表记录内容示例

admin@localhost : performance_schema 03:23:47> select * from mutex_instances limit 1;
+--------------------------------------+-----------------------+---------------------+
| NAME                                | OBJECT_INSTANCE_BEGIN | LOCKED_BY_THREAD_ID |
+--------------------------------------+-----------------------+---------------------+
| wait/synch/mutex/mysys/THR_LOCK_heap |              32576832 |                NULL |
+--------------------------------------+-----------------------+---------------------+
1 row in set (0.00 sec)

admin@localhost : performance_schema 03:23:59> select * from mutex_instances where LOCKED_BY_THREAD_ID is not null limit 1;
Empty set (0.01 sec)
  • 表定义语句
CREATE TABLE `mutex_instances` (
  `NAME` varchar(128) NOT NULL,
  `OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL,
  `LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8

上一篇: file_instances表 | 下一篇: rwlock_instances表

Clone this wiki locally