-
Notifications
You must be signed in to change notification settings - Fork 111
rwlock_instances
xiaoboluo768 edited this page Jun 8, 2020
·
2 revisions
-
rwlock_instances表列出了server执行rwlock instruments时performance_schema所见的所有rwlock(读写锁)实例。rwlock是在代码中使用的同步机制,用于强制在给定时间内线程可以按照某些规则访问某些公共资源。可以认为rwlock保护着这些资源不被其他线程随意抢占。访问模式可以是共享的(多个线程可以同时持有共享读锁)、排他的(同时只有一个线程在给定时间可以持有排他写锁)或共享独占的(某个线程持有排他锁定时,同时允许其他线程执行不一致性读)。共享独占访问被称为sxlock,该访问模式在读写场景下可以提高并发性和可扩展性
-
根据请求锁的线程数以及所请求的锁的性质,访问模式有:独占模式、共享独占模式、共享模式、或者所请求的锁不能被全部授予,需要先等待其他线程完成并释放
-
rwlock_instances表字段含义如下:
- NAME:与rwlock关联的instruments名称
- OBJECT_INSTANCE_BEGIN:读写锁实例的内存地址
- WRITE_LOCKED_BY_THREAD_ID:当一个线程当前在独占(写入)模式下持有一个rwlock时,WRITE_LOCKED_BY_THREAD_ID列可以查看到持有该锁的线程THREAD_ID,如果没有被任何线程持有则该列为NULL
- READ_LOCKED_BY_COUNT:当一个线程在共享(读)模式下持有一个rwlock时,READ_LOCKED_BY_COUNT列值增加1,所以该列只是一个计数器,不能直接用于查找是哪个线程持有该rwlock,但它可以用来查看是否存在一个关于rwlock的读争用以及查看当前有多少个读模式线程处于活跃状态
-
rwlock_instances表不允许使用TRUNCATE TABLE语句
-
通过对以下两个表执行查询,可以实现对应用程序的监控或DBA可以检测到涉及锁的线程之间的一些瓶颈或死锁信息:
- events_waits_current:查看线程正在等待什么rwlock
- rwlock_instances:查看当前rwlock行的一些锁信息(独占锁被哪个线程持有,共享锁被多少个线程持有等)
-
注意:rwlock_instances表中的信息只能查看到持有写锁的线程ID,但是不能查看到持有读锁的线程ID,因为写锁WRITE_LOCKED_BY_THREAD_ID字段记录的是线程ID,读锁只有一个READ_LOCKED_BY_COUNT字段来记录读锁被多少个线程持有
-
表记录内容示例
admin@localhost : performance_schema 10:28:45> select * from rwlock_instances limit 1;
+-------------------------------------------------------+-----------------------+---------------------------+----------------------+
| NAME | OBJECT_INSTANCE_BEGIN | WRITE_LOCKED_BY_THREAD_ID | READ_LOCKED_BY_COUNT |
+-------------------------------------------------------+-----------------------+---------------------------+----------------------+
| wait/synch/rwlock/session/LOCK_srv_session_collection | 31856216 | NULL | 0 |
+-------------------------------------------------------+-----------------------+---------------------------+----------------------+
1 row in set (0.00 sec)
- 表定义语句
CREATE TABLE `rwlock_instances` (
`NAME` varchar(128) NOT NULL,
`OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL,
`WRITE_LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL,
`READ_LOCKED_BY_COUNT` int(10) unsigned NOT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
上一篇: mutex_instances表 | 下一篇: socket_instances表
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!