-
Notifications
You must be signed in to change notification settings - Fork 111
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表
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!