连接锁分析
实现了一种轻量级的锁定剖析方法,作为性能计数器的替代方案。SmartEDB 锁通过 MCO_BEGIN_WAIT_EVENT / MCO_END_WAIT_EVENT 宏封装,将锁标识符存储在内部结构中,仅需单次赋值操作且无需同步,因此性能开销极小,能精确定位连接阻塞点。
此外,还提供了一个基本的性能分析工具,每隔 n 微秒采样连接状态,用于收集锁统计信息并识别最繁忙的锁。SmartEDB 性能监视器不显示这些信息,因为它只关注 CPU 消耗,而不考虑等待锁的时间。
在 xSQL 中,使用 start_profile(rate_usec) 和 stop_profile() 函数可获取锁配置文件,前者启动指定周期的采样线程,后者停止采样并输出结果。连接状态也可通过查询 ConnectionInfo 表获得,详情参见 xSQL 统计信息日志记录页面。
轻量级锁分析
调用 stop_profile() 函数输出的锁分析结果包含百分比、命中次数以及当前等待事件。 例如,以下命令展示了创建表并插入 100,000 行数据的锁分析结果:
select start_profile(10);
create table foo(x integer);
insert into foo select s ."#1" from generate_series(1,100000) s;
select count(*) from foo where (x %% 2) = 1;
select * from stop_profile();
percent hits event
----------------------------------------------------------------
96.3159222811002 3817 NONE
1.86727226848347 74 MVCC_TREE_READ_LOCK
0.656068634872571 26 MVCC_FRA_MUTEX
0.403734544536967 16 MVCC_CS_LOCK
0.353267726469846 14 MVCC_LEAF_WRITE_LOCK
0.252334090335604 10 MVCC_LEAF_READ_LOCK
0.126167045167802 5 MVCC_TREE_WRITE_LOCK
0.0252334090335604 1 MVCC_PM_MUTEX
0 0 READ
0 0 WRITE
0 0 FLUSH
0 0 MURSIW_TM_LOCK
0 0 MURSIW_TRANS_LOCK
0 0 MURSIW_READER_LOCK
0 0 MURSIW_WRITER_LOCK
0 0 MVCC_TM_LOCK
0 0 MVCC_EXCLUSIVE_LOCK
0 0 MVCC_SERIALIZABLE_LOCK
0 0 MVCC_BLOB_MUTEX
0 0 MVCC_HASH_WRITE_LOCK
0 0 MVCC_HASH_READ_LOCK
0 0 MVCC_KDTREE_WRITE_LOCK
0 0 MVCC_KDTREE_READ_LOCK
0 0 MVCC_PTREE_WRITE_LOCK
0 0 MVCC_PTREE_READ_LOCK
0 0 MVCC_RTREE_WRITE_LOCK
0 0 MVCC_RTREE_READ_LOCK
0 0 MVCC_DB_MUTEX
0 0 DM_MUTEX
0 0 DM_PAGE_MUTEX
0 0 DM_ALLOC_MUTEX
0 0 EXCLUSIVE_COMMIT_LOCK
0 0 SHARED_COMMIT_LOCK
0 0 ASYNC_LOCK
0 0 ASYNC_MUTEX
0 0 HEADER_LOCK
0 0 WCHAR_BUF_MUTEX
0 0 SOCKET_RECV
0 0 SOCKET_SEND
Selected records: 39