该 rwlock_instances
表列出了 Performance Schema 在服务器执行期间看到的所有 rwlock(读写锁)实例。一个 rwlock
是代码中用于强制多个线程在给定时间访问某个公共资源的同步机制,遵循一定的规则。该资源被称为由 rwlock
“保护”的。访问可以是共享的(多个线程可以同时拥有读锁),独占的(只有一个线程可以拥有写锁),或共享独占的(一个线程可以拥有写锁,同时允许其他线程进行不一致的读取)。共享独占访问也称为 sxlock
,它可以优化并发性和读写工作负载的可扩展性。
根据请求锁的线程数量和锁的性质,访问可以被授予共享模式、独占模式、共享独占模式或根本不授予,等待其他线程完成。
该 rwlock_instances
表具有以下列:
-
NAME
与锁关联的仪器名称。
-
OBJECT_INSTANCE_BEGIN
仪器锁的内存地址。
-
WRITE_LOCKED_BY_THREAD_ID
当一个线程当前拥有独占(写)锁时,
WRITE_LOCKED_BY_THREAD_ID
是锁定线程的THREAD_ID
,否则为NULL
。 -
READ_LOCKED_BY_COUNT
当一个线程当前拥有共享(读)锁时,
READ_LOCKED_BY_COUNT
递增 1。这只是一个计数器,不能直接用来查找哪个线程持有读锁,但可以用来查看是否存在读锁争用和活动的读者数量。
该 rwlock_instances
表具有以下索引:
-
主键(
OBJECT_INSTANCE_BEGIN
) -
索引(
NAME
) -
索引(
WRITE_LOCKED_BY_THREAD_ID
)
TRUNCATE TABLE
不允许用于 rwlock_instances
表。
通过对以下两个表的查询,监控应用程序或 DBA 可以检测到线程之间的某些瓶颈或死锁,涉及到锁:
-
events_waits_current
,以查看线程正在等待哪个rwlock
-
rwlock_instances
,以查看哪个线程当前拥有rwlock
有一些限制:rwlock_instances
只能用于标识持有写锁的线程,但不能标识持有读锁的线程。