首批通过分布式安全可靠测评,为关键业务系统打造
如何排查租户队列积压
更新时间:2024-08-09 10:16
本文介绍如何排查租户队列积压。
租户队列积压的原因
在 OceanBase 数据库中,如果发现数据库响应缓慢或存在登录、执行操作超时等问题,可能是因为某个租户的请求队列发生了积压。租户队列积压意味着队列中的请求处理(消费)速度低于请求到达(生产)速度,导致队列中的请求堆积增多,本质原因是线程处理请求慢。
租户队列积压的现象与相关报错
下边列举了租户队列积压可能的现象和相关报错。
登录数据库卡住,MySQL 命令执行卡住或超时。
报错日志中出现 recv_request 错误,指示请求推送到队列失败。
recv_request (ob_tenant.cpp:1162) [48090][RpcIO][T0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=31] push request to queue fail(ret=-4019报错日志中出现 deliver_request_fail 错误,带有错误码 -4019。
执行超时导致无主。
客户端 RPC 报错,
execute rpc fail(ret=****, dst="*****")。一般通过 dst=ip 找到 server 端地址,通过报错的前后文找到对应租户 tenant_id,然后到 server 端搜到对应租户队列看是否积压。通过监控发现某个租户的 CPU 使用率持续偏高。
租户队列积压的排查步骤
确认积压情况。
通过日志信息,确认是否存在队列积压,示例:
grep ' dump tenant info(tenant={id:1004' observer.log输出结果如下:

关键指标包括 req_queue:total_size、multi_level_queue:total_size 和 group_id = *, queue_size 等,如果这些值不为 0,则说明存在积压。
如果想要知晓每个 queue 或其他字段具体信息,可以下来参考文档 dump tenant info。
注意
1004 换成实际 tenant_id 值。
抓取堆栈
当确认有持续积压时,一定要在队列积压期间抓取堆栈信息。可以使用 pstack 或 obstack 工具进行抓取。
如果在线上环境不方便进行堆栈抓取,可以通过监控
recv_mysql_cnt、recv_np_rpc_cnt等字段,判断是否由于请求量大导致线程处理不及时。分析堆栈信息。
在堆栈文件中搜索
ObWorkerProcessor::process或ObWorkerProcessor::process_one,这两个关键字表示工作线程在处理请求时的最外层接口,这样的堆栈大概率是处理请求卡住的线程。示例如下:

找到后,可以通过线程名 T1004_TNT_LX_GX (V3.x 已简化为 TNT_LX_GX_1004,V4.x 已简化为 T1004_LX_GX),确认是 1004 租户的工作线程。
通过以上步骤,可以有效排查和解决 OceanBase 数据库中租户队列积压的问题。在实际操作中,每个步骤可能需要根据具体情况灵活调整,并结合具体的系统环境和应用场景进行分析。
队列爆但是很快恢复类问题如何排查
对于快速出现然后恢复的队列积压(特指队列爆了已经出现 4019 错误但 dump tenant info 没有看到积压的场景),可以设置日志探针,在队列失败时强制生成 core dump 文件,进而分析线程堆栈和队列状态。
适用版本
OceanBase 数据库所有版本。