该mutex_instances
表列出了服务器执行时性能模式看到的所有互斥量。互斥量是代码中使用的一种同步机制,用于强制在给定时间只有一个线程可以访问某些公共资源。据说该资源受到互斥锁的
“保护” 。
当在服务器中执行的两个线程(例如,同时执行查询的两个用户会话)确实需要访问相同的资源(文件、缓冲区或一些数据)时,这两个线程相互竞争,因此第一个获取互斥量锁的查询导致另一个查询等待,直到第一个查询完成并解锁互斥量。
持有互斥量时执行的工作被称为 “临界区”,多个查询确实以串行方式(一次一个)执行该临界区,这是一个潜在的瓶颈。
该mutex_instances
表有以下列:
NAME
与互斥体关联的仪器名称。
OBJECT_INSTANCE_BEGIN
检测互斥体在内存中的地址。
LOCKED_BY_THREAD_ID
当一个线程当前有一个互斥锁被锁定时,
LOCKED_BY_THREAD_ID
是THREAD_ID
锁定线程的 ,否则它是NULL
。
TRUNCATE TABLE
不允许用于mutex_instances
表。
对于代码中检测到的每个互斥量,性能模式提供以下信息。
该
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
, 查看当前拥有互斥量的其他线程