首批通过分布式安全可靠测评,为关键业务系统打造
ob_server_exists_long_lived_trans OB 服务器存在长事务
更新时间:2026-04-14 11:55:54
告警描述
该告警监测 OBServer 节点上是否存在持续时长超过阈值(默认为 1200 秒)的事务,存在则上报告警。
告警原理
下表列出了该告警监控逻辑中涉及的关键参数。
| 参数 | 值 |
|---|---|
| 监控指标 | ob_server_max_trans_duration_seconds |
| 数据来源 | SELECT MAX(timestampdiff(SECOND,ctx_create_time,CURRENT_TIMESTAMP)) as duration_seconds FROM __all_virtual_trans_stat WHERE part_trans_action <= 2 AND svr_ip = ? AND svr_port = ? AND is_exiting != 1 AND timestampdiff(SECOND,ctx_create_time,CURRENT_TIMESTAMP) >= 30 HAVING duration_seconds IS NOT NULL; |
| 采集指标(单位:秒) | max_trans_duration_seconds |
| 监控表达式 | max(max_trans_duration_seconds{metric_group="max_duration_virtual_trans_stat",@LABELS}) by (@GBLABELS) |
| 采集周期 | 60 秒 |
监控指标 ob_server_max_trans_duration_seconds 的值表示 SQL 执行时事务的最大持续时长,当最大持续时长大于阈值(默认为 1200s)时触发告警。
规则信息
| 监控指标 | 默认阈值(单位:秒) | 持续时间 | 告警周期 | 消除周期 |
|---|---|---|---|---|
| ob_server_max_trans_duration_seconds | 1200 | 0 秒 | 60 秒 | 5 分钟 |
告警信息
| 告警触发方式 | 告警等级 | 范围 |
|---|---|---|
| 基于监控指标的表达式 | 严重 | 服务器 |
告警模板
- 告警概述
- 模板:${alarm_target} ${alarm_name}
- 样例:ob_cluster=obcluster-1:svr_ip=xxx.xxx.xxx.xxx OB 服务器存在长事务
- 告警详情
- 模板:${alarm_target} ${alarm_name}, 最大事务持续时间为 ${value} 秒,超过 ${alarm_threshold} 秒
- 样例:ob_cluster=obcluster-1:svr_ip=xxx.xxx.xxx.xxx OB 服务器存在长事务, 最大事务持续时间为 1500 秒,超过 1200 秒。
其中,${alarm_target} 表示产生告警的对象。格式为 ob_cluster=xx:svr_ip=xx。ob_cluster 为产生告警的 OB 集群名称,svr_ip 为产生告警的 OB 服务器 IP。
对系统的影响
长事务的存在易造成大量的阻塞和锁超时,影响其他事务的执行。
可能原因
少数派、磁盘满、内存爆或业务中存在大事务等都有可能出现长事务。
处理方法
确认是否出现少数派情况。 少数派出现一般因为 OBServer 节点异常或网络故障,会同时有 ob_cannot_connected OB 服务器无法连接 告警上报。 如有该告警上报,则先参考该告警文档处理。然后再观察 5 分钟后本节所述告警是否消除。
确认是否磁盘空间不足。 若磁盘空间不足,则会有下述告警同时上报,可先参考下述告警对应文档解决后,再观察 5 分钟后本节所述告警是否消除。
确认是否内存不足。
若内存不足,则可能会伴随 ob_host_mem_percent_over_threshold OB 服务器内存使用率超限 告警上报,处理方法请参考该告警的解决方法。
确认是否存在大事务。
在 OCP 的 性能诊断 界面,通过 TopSQL 和 SlowSQL 页签中的内容查看是否有可疑 SQL,如执行时间过长的 SQL。
如有,可通过 诊断结果 进行分析对 SQL 进行优化,同时结合业务判断是否能将大事务拆成小事务。
若以上方法都未能解决问题,请参考下述指令联系技术支持人员处理。
-- 查看所有 Server 信息,用于确定是否存在异常 OBServer 节点 select * from __all_server; -- 查看当前长事务 SELECT * FROM __all_virtual_trans_stat WHERE part_trans_action <= 2 AND ctx_create_time < DATE_SUB(NOW(), INTERVAL 1200 SECOND) LIMIT 100;