oceanbase / obdiag

obdiag (OceanBase Diagnostic Tool) is designed to help OceanBase users quickly gather necessary information and analyze the root cause of the problem.
https://www.oceanbase.com/docs/obdiag-cn
Mulan Permissive Software License, Version 2
134 stars 27 forks source link

[Enhancement]: 锁冲突根因分析场景迭代 #327

Open jingyd66 opened 1 month ago

jingyd66 commented 1 month ago

Description

版本:3.1.4 和4.2.1 租户级别 1.就是针对租户dml操作慢的场景,可以定位到有锁等待(ocp上面的重试信息); 2.能确认出我当前执行事务卡住的会话id, 3.根据我当前锁等待的行找到对应持锁事务的信息,如持锁的会话id;

确定好这两块等锁和拿锁会话id,知道拿锁的会话id执行了什么,等锁的会话id执行了什么;应用根据业务逻辑做出选择去杀哪个会话

因为生产环境锁等待的事务有多个,持锁事务也有多个,希望把锁冲突的rca用到生产环境排查问题中

希望内核同学能给下方案,我们这边有环境可复现,可以开发该功能

YangEfei commented 1 month ago

https://github.com/oceanbase/oceanbase/commit/1196d9a5e80c6ac2f37256cc5cfe67503f599bf0 在本次提交中,在 OB_LOCKS 中新增了 session_id 列,表示当前请求锁的会话 id,同时调整了 ID1 / ID2 列,分别表示持锁事务 id / 持锁会话 id,对 type = 'TR' 类型的锁,即行锁,还会展示 ID3 列,形为 tablet_id - rowkey。

因此对于该 issue 内的问题,可以通过过滤 BLOCK = 1 AND TYPE = 'TR' 来过滤发生冲突的行锁,以此可以观察到行等待关系,并获取到持锁 / 等锁的事务 id 和会话 id,分别为 ID1 / trans_id 和 ID2 / session_id。

此外,需要注意的是,TR 类型的锁,即行锁,会在发生转储 / fast commit 后退化为 TX 类型的锁,即事务锁,此时若未发生冲突,只能观察到某事务持锁,但不知道其具体持有哪些锁。但是发生冲突时,仍能通过上面的过滤条件观察到冲突发生的行。