该 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,以查看哪个线程当前拥有互斥