该 mutex_instances
表列出了 Performance Schema 在服务器执行期间看到的所有互斥器。互斥器是代码中用于强制只有一个线程在给定时间可以访问某个公共资源的同步机制。该资源被称为由互斥器“保护”。
当两个线程在服务器中执行(例如,两个用户会话同时执行查询)时,它们需要访问同一个资源(文件、缓冲区或某些数据),这些线程将相互竞争,以便第一个查询获得互斥器锁,导致另一个查询等待,直到第一个查询完成并释放互斥器。
在持有互斥器期间执行的工作被称为在 “临界区” 中执行,多个查询将以串行方式执行该临界区(一次一个),这可能是一个瓶颈。
该 mutex_instances
表具有以下列:
-
NAME
与互斥器关联的仪器名称。
-
OBJECT_INSTANCE_BEGIN
仪器化互斥器在内存中的地址。
-
LOCKED_BY_THREAD_ID
当线程当前锁定互斥器时,
LOCKED_BY_THREAD_ID
是锁定线程的THREAD_ID
,否则为NULL
。
该 mutex_instances
表具有以下索引:
-
主键在 (
OBJECT_INSTANCE_BEGIN
) -
索引在 (
NAME
) -
索引在 (
LOCKED_BY_THREAD_ID
)
TRUNCATE TABLE
不允许用于 mutex_instances
表。
对于代码中的每个仪器化互斥器,Performance Schema 提供以下信息。
-
该
setup_instruments
表列出了仪器点的名称,带有前缀wait/synch/mutex/
。 -
当某些代码创建互斥器时,将添加一行到
mutex_instances
表中。OBJECT_INSTANCE_BEGIN
列是唯一标识互斥器的属性。 -
当线程尝试锁定互斥器时,
events_waits_current
表将显示该线程的行,指示它正在等待互斥器(在EVENT_NAME
列中),并指示等待的互斥器(在OBJECT_INSTANCE_BEGIN
列中)。 -
当线程成功锁定互斥器时:
-
events_waits_current
表显示等待互斥器的完成(在TIMER_END
和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
,以查看哪个线程当前拥有互斥