OceanBase
  • 产品
  • 解决方案
  • 客户
  • 合作伙伴
  • 资源与服务
  • 文档
  • 社区
云控制台登录 / 注册
  • 免费试用
OceanBase AI 数据平台

基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。

一体化能力

TP 事务处理

关键业务稳定运行,保障数据零丢失

AP 实时分析

事务分析一体,驱动智能决策与运营

AI 现代负载

统一多模态数据,支撑生产级应用

关键产品
OceanBase 分布式数据库

首批通过安全可靠测评,面向关键业务

OceanBase 集中式数据库

集中式架构,兼具性能与成本优势

OceanBase AI 数据库

面向 AI 应用与 Agent 的多模数据库

OceanBase AI 湖库

湖库一体的 AI 多模态数据系统

OceanBase DataPilot

企业级 AI 数据分析 Agent

OceanBase Agentbase

企业级 Agent 后端基础设施

OceanBase OAgent

数据库 AI 运维 Agent

OB Cloud

一体化云数据库,提供多云一致体验

OceanBase 数据库一体机

软硬一体,极致性能与高可靠性保障

OceanBase AI 一体机

开箱即用的 AI 数据库一体机

OMA 迁移评估工具

全链路数据库迁移评估

OMS 数据迁移工具

一站式数据传输与同步

OCP 运维管理工具

数据库全生命周期管理

ODC 开发者工具

数据库开发与管控协同

OAS 自治服务工具

数据库智能诊断与自治

通用场景
全场景业务系统 OLTP
实时分析混合负载
异地多活
多基础设施部署
一站式传统数据库升级
混合云部署
一库多芯软硬件混合部署
分布式数据库单机部署
大存储类数据库降本
冷数据归档降本
多实例资源整合
分库分表一体化升级
高并发场景
数据中台
行业解决方案
国有大行和股份制银行核心系统解决方案
区域性银行核心系统解决方案
寿险核心系统解决方案
产险核心系统解决方案
资管交易类系统解决方案
资管 TA 清算类系统解决方案
运营商核心系统解决方案
人社核心系统解决方案
电力核心系统解决方案
行业专区
银行专区

助力银行完成各类核心业务系统升级

保险专区

寿险、产险核心系统升级的更佳选择

零售专区

助力200+零售行业客户规模化落地

DB 大咖说
oceanbase爱奇艺

百亿级卡券业务的“单库双擎”架构升级

oceanbase四川银行

800个测试用例选定分布式数据库

oceanbase太平洋保险

先难后易,核心系统数据库升级复盘

行业案例
oceanbase交通银行

核心数据库的“分布式革命”

oceanbase中国移动

B域核心CRM&BOSS近乎零改造分布式升级

oceanbase理想

打造领先的智能制造系统和自动驾驶体验

演讲实录
oceanbase中国联通

集团应用分布式数据库覆盖B/O/M域

oceanbase国泰海通

智能推送系统稳定支撑单日亿级消息处理量

oceanbase中国联合航空

中国首款机票盲盒背后的数据库力量

用户实践
oceanbase北京银行

最快速度完成40余套系统国产数据库升级

oceanbaseVIVO

替换 MySQL 分库分表,探索成本效益最优

oceanbase滴滴

数据库大规模运维体系建设及落地实践

合作伙伴
合作伙伴类型
联合解决方案
产业生态伙伴
经销商伙伴
技术服务伙伴
培训认证伙伴
生态联合解决方案
神州信息 x OceanBase 银行核心系统
长亮科技 x OceanBase 新核心系统
中电金信 x OceanBase 金融分布式核心系统
天阳科技 x OceanBase 贷记卡方案
易诚互动 x OceanBase 手机银行方案
恒生 x OceanBase UF3.0/O45/TA/估值方案
商业发行版
云树®数据库软件 ActionDB
服务
支持与服务
提交工单
软件下载
OceanBase 企业版
OceanBase 社区版
OB Cloud
学习
培训与认证
在线课堂
在线体验
开发者
开发者中心
资料
行业报告与白皮书
官方博客
年度发布会资料
开发者大会资料
oceanbase白皮书

金融核心系统数据库升级路径与场景实践

oceanbase白皮书

人社关键业务数据库一体化升级实践

产品文档
oceanbaseOceanBase 数据库
数据库一体机
oceanbaseOceanBase AI 数据库
工具与组件
oceanbaseOB Cloud 云数据库
驱动和中间件
快速上手
OceanBase 数据库
OB Cloud 云数据库
知识库
汇聚常见产品使用问题案例
在线体验

Demo与实验,感受 OceanBase 的核心能力与应用场景

OceanBase 最佳实践
了解 OceanBase 分布式数据库的架构与系统原理
技术博客

技术解析 | 用户实践 | 社区月报

在线课堂

电子书 |视频课程|在线培训

Developer Hub
应用开发Demo | 数据开发与集成工具
问答论坛

快速答疑 | 常见问题 | 技术交流

社区活动

Meetup | 技术公开课

GitHub

查看源码 | 贡献代码 | 建议反馈

加入社区

社区组织 | 社区用户贡献 |开发者贡献

进入社区首页
oceanbase数据库大赛

第六届OceanBase数据库大赛

oceanbase免费课程

《Easy Data x AI》:面向所有 AI 爱好者的 Data 与 AI 基础知识入门教程

切换语言
  • 中文站 - 简体中文
  • International - English
  • 日本站 - 日本語

OceanBase

OceanBase 海扬数据库始创于 2010 年,是完全自主研发的数据库公司。2020年开始独立商业化运作,历经15年大规模核心场景验证,目前是中国数据库的领军企业之一。从分布式数据库到 AI 数据库,为企业提供安全、稳定、可扩展的数据底座,推动数据基础设施全面拥抱 AI 时代。

关于我们

关于 OceanBase最新动态资质荣誉客户专家委员会招贤纳士合作伙伴年度发布会开发者大会

资源与服务

支持与服务文档知识库软件与工具下载培训与认证在线体验数据库专题视频

社区

快速上手开发者中心博客活动学习问答GitHub

数据库百科

分布式数据库国产数据库OLTP 数据库OLAP 数据库HTAP 数据库数据库向量数据库向量检索

联系我们

服务热线:
400-109-0633
商务咨询
培训认证技术支持媒体合作
京公网安备11010802047223号京公网安备11010802047223号
京ICP备20024574号-1
合字B1.B2-20250395
网站服务协议隐私协议安全响应协议
OceanBase 版权所有 © 2026 基础资源和备案服务由阿里云提供
文档反馈
  1. 文档中心
  2. OceanBase 数据库
  3. 分布式版
  4. V5.0.1
  5. 参考指南
  6. 系统原理
  7. OBServer 节点架构
  8. observer 线程模型
  9. 工作线程
分布式版-V5.0.1
  • 简介
  • 快速上手
  • 应用开发
  • 部署
  • 升级
  • 数据迁移
  • 管理数据库
  • AP
  • AI
  • 生态集成
  • 实践教程
  • 参考指南
    • 系统原理
      • 数据库整体架构
      • 数据库的发展历程
      • 多租户架构
      • 数据库对象
      • 分布式数据库对象
      • 数据链路
      • 用户接口和查询语言
      • 事务管理
      • 存储架构
      • 数据可靠性和高可用
      • 数据库安全
      • OBServer 节点架构
        • OBServer 节点安装目录结构
        • 配置文件
        • observer 线程模型
          • 线程简介
          • 工作线程
          • 后台线程
        • 日志
        • 内存管理
        • 插件机制
    • 系统管理
    • 数据库对象管理
    • 数据库设计规范和约束
    • SQL 参考
    • PL 参考
    • 系统视图
    • 配置项和系统变量
    • 错误码
    • 性能调优
    • 数据库代理
    • 驱动
    • 平台产品
    • 组件 & 工具
    • 数据库插件
  • 常见问题
  • 版本发布记录
  • 术语
  1. 文档中心
  2. OceanBase 数据库
  3. 分布式版
  4. V5.0.1
  5. 参考指南
  6. 系统原理
  7. OBServer 节点架构
  8. observer 线程模型
  9. 工作线程

工作线程

更新时间:2026-07-29 10:39:50

github-fill编辑
编组分享

处理 SQL 和事务请求的线程也称为工作线程,是分租户的,也即每个租户都有自己的一套 sql/transaction worker。

多租户线程池

线程池简介

多租户共享一个大线程池,租户从线程池中申请工作线程。线程池跟随多租户进行初始化和销毁,多租户初始化时,预先申请一定数目的线程,后续在租户运行过程中,还支持动态的扩展线程池。

初始线程池大小与 observer 节点的 CPU 数,系统租户预留线程数,虚拟租户预留线程数有关,部分可通过配置项配置。后续扩展线程池时的线程数上限受 OBServer 节点线程数上限和多租户线程数上限共同限制,可通过配置项配置。

线程池相关配置项

  • _ob_max_thread_num

    决定 OBServer 节点的线程数上限。

    默认值为 9999,取值范围为 [0, 10000),非动态生效。

  • server_cpu_quota_min

    决定系统租户的最小虚拟 CPU 个数,与机器物理 CPU 无直接关系,仅影响多租户线程池的初始大小。

    默认值为 0,取值范围为 [0, 16],动态生效。

  • server_cpu_quota_max

    决定系统租户的最大虚拟 CPU 个数,与机器物理 CPU 无直接关系,仅影响多租户线程池的上限大小。

    默认值为 0,取值范围为 [0, 16],动态生效。

  • election_cpu_quota

    决定 election 租户的虚拟 CPU 个数,与机器物理 CPU 无直接关系,仅影响多租户线程池的初始大小和上限大小。

    默认值为 3,取值范围为 [0, 16],非动态生效。

  • location_cache_cpu_quota

    决定 location cache 租户的虚拟 CPU 个数,与机器物理 CPU 无直接关系,仅影响多租户线程池的初始大小和上限大小。

    默认值为 5,取值范围为 [0, 16],非动态生效。

租户线程

租户线程构成

单个租户的线程包含,处理嵌套请求的 7 个专有线程,处理一般请求的若干个普通线程。线程可处于活跃,挂起两种状态。由于嵌套请求的专用线程对外基本无感知,以下介绍只涉及普通线程。

活跃线程数概念

活跃线程表示能正常处理请求的线程,与挂起线程区分,活跃线程数用于限制单个租户的 CPU 使用。租户运行时会维持活跃线程数恒定,租户的活跃线程数受配置项和 Unit 规格共同决定。活跃线程数 = unit_min_cpu * cpu_quota_concurrency。

大查询的线程挂起逻辑

用户发给 OBServer 节点的 SQL,可以粗略分为两类:一类 SQL 访问和操作的数据量小,所以执行很快;另一类 SQL 要访问大量的数据或者要写入大量数据,所有执行耗时长。我们把第二类耗时长的 SQL 叫做大查询。

大查询的特殊处理基于一个直观的用户效用假设,从影响用户数和延迟的 QoS(Quality of Service)要求来合理猜想:1000 个小查询被延迟的影响要远大于 1 个大查询被延迟。换言之,与其花 1s 时间处理一个大查询,不如把同样的 CPU 时间用来处理 1000 个小查询。

请求被判定为大查询的条件是,处理时间超过大查询阈值,此阈值可通过配置项调整。

租户线程中持有被判定为大查询请求的线程,一部分可直接获得继续执行权,其余的需要挂起等待。可获得继续执行权的线程的比例由配置项决定。

最大线程数概念

为了维持租户活跃线程数恒定,同时考虑到大查询线程挂起的发生,租户就需要动态的从多租户线程池中申请线程。最大线程数用于限制单个租户的内存开销,每个租户总共可持有的最大线程数受配置项和 Unit 规格共同决定。最大线程数 = unit_max_cpu * workers_per_cpu_quota。

相关配置项

  • cpu_quota_concurrency

    决定租户活跃线程数与租户 Unit 规格的倍数关系。

    默认值为 4,取值范围为 [1, 20],动态生效。

  • workers_per_cpu_quota

    决定租户最大线程数与租户 Unit 规格的倍数关系。

    默认值为 10,取值范围为 [2, 20],动态生效。

  • large_query_worker_percentage

    决定租户线程中享有大查询继续执行权的线程的百分比。

    默认值为 30,取值范围为 [0, 100],动态生效。

  • large_query_threshold

    请求判定为大查询的处理时间阈值。

    默认值为 5s,取值范围为 [1ms, +∞],动态生效。

关于配置项的查询和修改方法请参见 设置参数。

日志诊断

通过 grep 'dump tenant info' observer.log* 指令可以获得租户的工作线程数情况和请求排队情况等。例如:

grep 'dump tenant info.tenant={id:1002' log/observer.log* | sed 's/,/,\n/g'

[2022-07-20 14:55:40.774143] INFO  [SERVER.OMT] run1 (ob_multi_tenant.cpp:1993) [80700][MultiTenant][T0][Y0-0000000000000000-0-0] [lt=621] 
dump tenant info(tenant={id:1002, //租户id
tenant_meta:{unit:{tenant_id:1002, // tenant_meta是租户元数据包括unit配置信息和SuperBlcok以及create_status
unit_id:1001, //unit id
has_memstore:true, // 是否有 MemTable
unit_status:"NORMAL", //unit的状态: UNIT_NORMAL/UNIT_MIGRATE_IN/UNIT_MIGRATE_OUT/UNIT_MARK_DELETING/UNIT_WAIT_GC_IN_OBSERVER/UNIT_DELETING_IN_OBSERVER/UNIT_ERROR_STAT
config:{unit_config_id:1003, // unit的配置id
name:"2c2g", //unit配置的名字
resource:{min_cpu:2, //unit配置的最小cpu数
max_cpu:2, // unit配置的最大cpu数
memory_size:"1.5GB", // unit配置的内存大小
log_disk_size:"5.4GB", // unit配置的日志盘大小
min_iops:20000, // unit配置的最小磁盘iops
max_iops:20000, // unit配置的最大磁盘iops
iops_weight:2}}, // unit配置的iops权重
mode:1, // CompatMode 0:MYSQL 1:ORACLE
create_timestamp:1658298418435426, // unit的创建时间
is_removed:false}, // 该unit是否被标记删除
super_block:{tenant_id:1002, // ObTenantSuperBlock信息
replay_start_point:ObLogCursor{file_id=1, // 租户slog的日志回放点
log_id=440,
offset=343322},
ls_meta_entry:[140](ver=0, // 租户ls meta的slog checkpoint入口点
mode=0,
seq=139),
tablet_meta_entry:[141](ver=0, // 租户tablet meta的slog checkpoint的入口点
mode=0,
seq=140)},
create_status:1}, // 租户的创建状态: CREATING = 0,CREATE_COMMIT=1,CREATE_ABORT=2,DELETING=3,DELETE_COMMIT=4
unit_min_cpu:"2.000000000000000000e+00", //最小cpu核数,保证提供
unit_max_cpu:"2.000000000000000000e+00", //最大cpu核数,限制上限
slice:"0.000000000000000000e+00",
slice_remain:"0.000000000000000000e+00",
token_cnt:8, //调度器分配的token数,一个token会转换为一个工作线程
sug_token_cnt:8,
ass_token_cnt:8, //租户当前确认的token数(根据token_cnt确认,一般两者相等)
lq_tokens:2, //Large Query token个数,根据token_cnt乘以大请求比例设置
used_lq_tokens:0, //当前持有LQ Token的Worker数
stopped:false, //租户unit是否正在删除
idle_us:6076629, //一轮(10秒)中工作线程空闲的总时间和, 所谓空闲实际只统计了等待队列的时间
recv_hp_rpc_cnt:1, //租户累计收到不同级别的rpc请求数,hp(High), np(Normal), lp(Low)
recv_np_rpc_cnt:5,
recv_lp_rpc_cnt:0,
recv_mysql_cnt:24, //租户累计收到的mysql请求数
recv_task_cnt:1, //租户累计收到的内部任务数
recv_large_req_cnt:0, //租户累计预判的大请求数,只会递增,不会清零。实际是重试的时候递增的。
tt_large_quries:0, //租户累计处理的大请求数, 只会递增,不会清零。实际是打点check的时候递增的。
pop_normal_cnt:1024555,
actives:8, //活跃工作线程数,一般和workers相等,它们的差包含:租户工作线程缓存+带工作线程的大请求缓存
workers:8, //租户持有的工作线程数, 实际就是workers_这个list的size。
nesting workers:7, //租户持有的嵌套请求专用线程数,共7个线程对应7个嵌套层级。
lq waiting workers:0, //处于被判定为处理大查询,并被挂起等待调度的工作线程
req_queue:total_size=0 queue[0]=0 queue[1]=0 queue[2]=0 queue[3]=0 queue[4]=0 queue[5]=0 , //不同优先级的工作队列,数字越小优先级越高
large queued:0, //当前预判出的大请求个数
multi_level_queue:total_size=0 queue[0]=0 queue[1]=0 queue[2]=0 queue[3]=0 queue[4]=0 queue[5]=0 queue[6]=0 queue[7]=0 , //存放嵌套请求的工作队列,1~7对应7个嵌套层级(queue[0]暂时不用,queue[5]也存放innersql请求)。
recv_level_rpc_cnt:cnt[0]=0 cnt[1]=0 cnt[2]=0 cnt[3]=0 cnt[4]=0 cnt[5]=0 cnt[6]=0 cnt[7]=0 ,
group_map:group_id = 1, //group_map后面跟着每个group_id对应group的线程和排队情况
queue_size = 0, //group队列排队情况
recv_req_cnt = 13526, //group累计push到队列请求数
pop_req_cnt = 13526, //group线程累计pop出的请求数
token_cnt = 2, //group分配的token数,一个token会转换为一个工作线程
min_token_cnt = 2,
max_token_cnt = 2,
ass_token_cnt = 2 , //group当前确认的token数(根据token_cnt确认,一般两者相等)
rpc_stat_info: pcode=0x150a:cnt=1489 pcode=0x150b:cnt=1091}) //租户一段时间内收到的最多的rpc pcode,统计周期10秒,最多打印前五

本文目录

多租户线程池线程池简介线程池相关配置项租户线程租户线程构成活跃线程数概念大查询的线程挂起逻辑最大线程数概念相关配置项日志诊断
有帮助
无帮助
反馈
AI