25.12.3.3 Mutex_instancestable

mutex_instancestable 列出了服务器执行时性能架构看到的所有互斥锁。互斥锁是代码中使用的一种同步机制,用于强制在给定时间只有一个线程可以访问某些公共资源。据说该资源已由 Mutex“保护”。

当服务器中执行的两个线程(例如,同时执行查询的两个用户会话)确实需要访问相同的资源(文件,缓冲区或某些数据)时,这两个线程将相互竞争,因此获得互斥锁的第一个查询将导致另一个查询 await,直到第一个查询完成并解锁互斥锁。

保持互斥锁时执行的工作被称为在“关键部分”中,并且多个查询确实以串行方式(一次一个)执行该关键部分,这是潜在的瓶颈。

mutex_instancestable 具有以下列:

  • NAME

与互斥锁关联的乐器名称。

  • OBJECT_INSTANCE_BEGIN

已检测互斥锁在内存中的地址。

  • LOCKED_BY_THREAD_ID

当前线程已锁定互斥锁时,LOCKED_BY_THREAD_ID是锁定线程的THREAD_ID,否则为NULL

mutex_instancestable 不允许TRUNCATE TABLE

对于代码中检测到的每个 Mutex,性能模式都提供以下信息。

  • setup_instrumentstable 列出了检测点的名称,并带有前缀wait/synch/mutex/

  • 当某些代码创建互斥量时,会将一行添加到mutex_instancestable 中。 OBJECT_INSTANCE_BEGIN列是唯一标识互斥锁的属性。

  • 当线程尝试锁定互斥锁时,events_waits_currenttable 显示该线程的一行,table 示它正在 await 互斥锁(在EVENT_NAME列中),并指示正在 await 哪个互斥锁(在OBJECT_INSTANCE_BEGIN列中)。

  • 当线程成功锁定互斥锁时:

  • events_waits_current显示对互斥对象的 await 已完成(在TIMER_ENDTIMER_WAIT列中)

  • 当线程解锁互斥锁时,mutex_instancestable 示该互斥锁现在没有所有者(THREAD_ID列为NULL)。

  • 销毁互斥对象后,将从mutex_instances中删除相应的行。

通过对以下两个 table 执行查询,监视应用程序或 DBA 可以检测到涉及互斥锁的线程之间的瓶颈或死锁: