大促期间,这两个事务在多个 OBServer 节点上大量并发,触发了分布式死锁。GV$OB_LOCK 视图中出现大量锁等待,部分会话被检测到死锁并自动回滚,但仍有大量事务长时间卡死,并且因为死锁检测的消耗,CPU sys 冲高,导致整个租户 TP 性能雪崩,
为什么分布式死锁检测会消耗大量 CPU sys,有没有什么可以调优的建议
4 个赞
一、sys CPU 冲高原因
OceanBase 分布式死锁检测由节点上报锁等待关系 + RS 全局图遍历找死锁环构成:
- 高并发下锁等待链表庞大,内核频繁遍历、DFS 环路检测、RPC 收发,均消耗内核态 CPU;
- 大量卡死事务持续堆积,链表只增不减,每轮检测开销叠加;
- 检测间隔过短、频繁查询锁视图、批量回滚事务,进一步放大开销;
- 仅回滚死锁环事务,普通锁等待会话依旧堆积,问题反复。
二、调优方案 - 应急止血(立即生效)拉长死锁检测周期、缩短锁等待超时;临时限流热点、停止高频查GV$OB_LOCK,手动清理长等待会话。
- 参数优化开启锁等待边裁剪、限制单轮上报数据量,关闭锁调试日志。
- 业务根治(最关键)打散热点行 / 分区;统一 SQL 更新顺序、做短事务、减少跨分区分布式事务;热点更新改用乐观锁,接口限流削峰。
2 个赞
dd