#资源管理
YashanDB资源管理通过配置物理资源(CPU、内存等)的分配规则,以满足不同用户或程序对资源的需求。通过资源管理,可以实现如下目标:
- 提供资源隔离能力,即使在极端场景下也能使用到自己配额内的资源,不受其他用户的影响。
- 保证数据库在稳定运行的前提下,最大限度地提高整体资源利用率。
- 允许配置并切换使用不同的资源使用计划,例如不需要重启情况下,切换适合白天和晚上的计划。
- 实时监控物理资源分配和使用情况。
共享集群/分布式集群部署中,无资源管理功能。
# 核心概念
# 资源使用组
资源使用组由资源使用者组成,同一资源使用组内的资源使用者共用一份资源计划指令。
系统包含如下默认资源使用组:
- SYS_GROUP:包括系统用户sys和系统进程。
- DEFAULT_CONSUMER_GROUP:不存在资源映射关系的资源使用者默认划分至该组。
创建会话时,YashanDB会根据用户的资源映射关系自动将其划分至相应资源使用组中。数据库管理员可以通过修改用户的资源映射关系调整该用户的新会话所属资源使用组。
# 资源映射
资源映射是指将资源使用者加入至资源使用组中,资源使用者以用户(USER)为维度。
资源使用组与资源使用者为一对多关系,即一个资源使用者只能加入一个资源使用组但一个资源使用组可以包含多个资源使用者。
# 资源计划
资源计划是对环境中每个节点物理资源(例如CPU)的分配计划,通过激活特定的资源计划来指定如何为资源使用组分配资源。
系统包含如下默认资源计划:
- TOALL: 一级资源计划,包含子计划SYS_GROUP和DEFAULT_CONSUMER_GROUP的资源计划指令。
- SYS_GROUP:二级资源计划,属于TOALL的子计划,包含关联系统用户sys和系统进程的资源计划指令。
通过切换不同的资源计划,能够为所有资源使用组切换对应的资源计划指令。
# 资源计划指令
资源计划指令描述了资源使用组在不同计划中对物理资源的分配规则。
资源计划与资源计划指令为一对多关系,即每个资源组在一个资源计划中只能指定一个资源计划指令。
# 资源类型
YashanDB资源管理通过配置物理资源(CPU、内存等)的分配规则,以满足不同用户或程序对资源的需求:
CPU资源管理适用于单机部署(非级联备)和存算一体分布式集群部署,且适用于Linux和ARM平台,不适用于docker容器。
内存资源管理适用于单机部署(非级联备)和存算一体分布式集群部署。
执行调度管理适用于存算一体分布式集群部署。
# CPU资源管理
YashanDB的CPU资源管理用于保证数据库在稳定运行的前提下,保障核心用户的使用和紧急任务的运行及最大限度提高CPU整体资源的利用率。
CPU资源管理功能按节点生效,例如配置某个用户的CPU资源上限为20%则表示该用户对环境中每个节点的CPU可使用上限为20%。CPU资源上限可能存在波动,上限+3%以内均属正常情况。
CPU资源管理的资源计划指令主要通过SHARES和UTILIZATION_LIMIT参数约束CPU使用份额。
# SHARES
CPU共享模式下的使用份额,须为[1,100]中的整数。当CPU资源不足时,该值越大就能获得更多的CPU资源。但是,具体分配的CPU资源需要根据与其它资源使用组的份额计算后确定。
为了确保内置资源使用组SYS_GROUP有足够的资源可用,当该组的共享资源(SHARES)较少或较多时,系统会根据用户的输入进行动态调整。如果SYS_GROUP的SHARES全局比例低于40%或高于60%时,系统会将SYS_GROUP的SHARES调整为其它资源使用组的SHARES总和。这种情况下,SYS_GROUP的SHARES值可能会超过100(可通过查看视图DBA_RSRC_PLAN_DIRECTIVES的SHARES字段来了解,全局比例的计算公式为:SYS_GROUP的SHARES / 所有资源使用组的SHARES总和)。
# UTILIZATION_LIMIT
CPU的最大可能使用率,须为[1,100]中的整数。无论系统的CPU资源如何,分配给资源使用组的CPU资源不会超过这个上限。计算CPU最大使用率的公式是UTILIZATION_LIMIT * CPU个数。例如一个用户映射的资源使用组设定的UTILIZATION_LIMIT为10,CPU的个数为2,那么这个用户最多够使用的20%的CPU资源。
# 内存资源管理
YashanDB用户内存资源管理,主要针对用户在一定时间内能独占的内存(即SPA,详情参考内存体系)进行分配和管理,公共缓存或其他没有用户属性的内存区域则不在管理范围内。
用户内存资源管理的资源计划指令主要通过SPA_LIMIT、SESSION_SPA_LIMIT和SPA_LIMIT_RESERVED参数约束会话和资源使用组的内存使用。
# SPA_LIMIT
计划指令中的SPA_LIMIT,表示对应资源使用组最大能使用整个系统的用户内存的比例值,公共缓存等其他内存不在限制内。在多实例部署下(例如存算一体分布式集群部署),SPA_LIMIT表示的是对应本地实例(或节点)内部SPA部分内存的占比。例如,CN节点与DN节点在内存配置上有不同的大小,资源使用组能在对应节点上使用的SPA内存的上限,都是通过SPA_LIMIT的比例进行折算的,每个节点最终的内存大小不一定是一样的。
# SESSION_SPA_LIMIT
资源使用组下的会话工作时,不仅受到整个资源使用组总的SPA内存上限比例SPA_LIMIT的限制,同时也受到单个会话自身的SESSION_SPA_LIMIT限制。SESSION_SPA_LIMIT表示该资源使用组下的会话(即会话对应的用户从属于该资源使用组),能使用资源使用组总的SPA内存上限的比例大小。例如资源使用组HIGH_GROUP的计划指令下SPA_LIMIT和SESSION_SPA_LIMIT分别是50和10,那对应的会话能使用SPA内存的上限为SPA总内存的5%(即50% * 10%)。
会话运行过程中会受到会话SPA内存上限约束,同时多个会话并发运行也收到资源使用组SPA内存上限的约束。
# SPA_LIMIT_RESERVED
在高并发性能敏感的场景下,SPA内存的集中管控无法避免带来性能损耗。计划指令中的SPA_LIMIT_RESERVED,允许资源使用组将一定比例的SPA内存使用额度预留下来,提前平均分配给各个会话,使得会话在没有超出该预留额度前,无需向资源使用组申请或释放,从而获得更优的性能表现。
由于不同部署形态下活跃会话的数量不同,预留额度分配的基数也不同:
- 单机部署下,预留额度按
MAX_SESSIONS配置参数的值进行分配; - 存算一体分布式集群部署下,预留额度按
MAX_WORKERS配置参数的值进行分配。如果MAX_WORKERS值为0,则按对应服务器上CPU核数的2倍计算。
# 执行调度管理
YashanDB执行调度管理,通过协调全局执行资源、排队调度等方式进行合理有序地执行,尽可能提高资源利用率和执行效率。
- 协调全局执行资源:通过执行前全局评估并在各节点预占执行资源(例如内存、并发线程等)方式,避免无效争抢。
- 排队调度机制:通过控制同时执行的资源密集型SQL操作的会话数量,达到资源有序使用的目的。
执行调度管理的资源计划指令主要通过PARALLEL_SERVER_LIMIT、EXECUTION_QUEUE_TIMEOUT和CONCURRENCY_LIMIT参数进行调度管理。
# PARALLEL_SERVER_LIMIT
YashanDB并行执行资源管理,通过在执行前预分配并行线程,有效减少系统在高并发情况下因并行线程不足而报错的情况。每个资源使用组分配了一定数量的可用并行线程,如果在执行时无法获取到足够的并行线程,系统会进行等待和重试,直到获取所需的线程资源。
资源使用组的最大并行资源百分比,须为[0,100]中的整数。根据系统总体可用的最大并行线程数MAX_PARALLEL_WORKERS,可以计算出每个资源使用组的可用并行线程数是 MAX_PARALLEL_WORKERS * (PARALLEL_SERVER_LIMIT / 100)。
# EXECUTION_QUEUE_TIMEOUT
存算一体分布式集群部署形态下,为了提高执行成功率,正式执行前会进行资源预占,同时在资源分配冲突导致失败后,支持重试处理。EXECUTION_QUEUE_TIMEOUT表示执行过程中的重试、等待的最大时间,不包含执行时间或重试的执行时间,超过这个时间则执行会失败报错。
# CONCURRENCY_LIMIT
在OLAP场景下,有大量需要较多资源执行的操作同时进行时,由于资源争抢剧烈,性能表现并不理想。通过配置CONCURRENCY_LIMIT参数可以控制同一资源使用组内允许同时进行资源密集型SQL操作的会话数量上限。达到阈值后,此类会话需要排队等待,等待时间超过EXECUTION_QUEUE_TIMEOUT时会报错退出。
受排队调度管控的资源密集型SQL类型,可以通过RSRC_QUEUE_OPERS参数配置。
# 配置资源管理
YashanDB资源管理通过内置高级包DBMS_RESOURCE_MANAGER和相关配置参数提供对物理资源的配置能力,具体介绍请查阅配置资源管理。
# RSRC_MODE
YashanDB通过RSRC_MODE参数控制是否对某个或某些物理资源启用资源管理能力,可选值如下:
NONE:默认值,表示不开启任何资源类型资源的管理。
CPU:表示开启对CPU资源的隔离及管理。
MEM:表示开启对用户内存资源的隔离及管理。
ALL:表示同时开启CPU和用户内存资源的隔离及管理。
该配置参数修改后,需要重启实例才能生效。
# RESOURCE_MANAGER_PLAN
YashanDB通过RESOURCE_MANAGER_PLAN参数激活具体的某个资源计划,只能指定为自定义创建的资源计划名称。
# RSRC_QUEUE_OPERS
YashanDB通过RSRC_QUEUE_OPERS参数来指定资源密集型SQL的类型,执行这些SQL的会话将受到调度管控,同时执行的对应操作的数量超过资源计划指令中的CONCURRENCY_LIMIT字段值时需要排队等待。
NONE:默认值,表示没有任何操作启用排队调度机制。
COL_QUERY:列存表查询操作。
ALL:可选的所有操作都启用排队调度机制。
# CDB中的资源管理
当YashanDB部署为容器数据库(配置参数ENABLE_PLUGGABLE_DATABASE=TRUE)时,资源管理支持CDB和PDB两级分层管理。
# 资源管理方式
-
主要用于控制整个容器数据库的资源分配策略,它定义了在CDB层面对CPU、内存等关键系统资源的整体调度规则和分配框架。可以通过资源计划指令为各个PDB分配具体资源配额,CDB资源计划与其计划指令之间构成父子关系。在CDB层面,DBA可以通过三种方式将资源划分给具体PDB:专属CDB资源计划指令、为PDB配置CDB资源计划模板或使用CDB默认资源计划指令。各类指令对PDB生效的优先级为CDB资源计划指令(CDB_PLAN_DIRECTIVE) > CDB资源计划模板(CDB_PROFILE_DIRECTIVE) > CDB默认资源计划指令(CDB_DEFAULT_DIRECTIVE)。
专属的CDB资源计划指令:为单个PDB指定专属指令,通过CREATE_CDB_PLAN_DIRECTIVE过程创建个性化指令,实现对特定PDB的精准资源控制。
CDB资源模板指令:批量为多个PDB指定统一指令模板,通过CREATE_CDB_PROFILE_DIRECTIVE创建指令模板,并使用SET_PDB_PROFILE完成模板与PDB的映射关联,适用于具有相似资源需求的PDB组。
CDB默认资源计划指令:为未指定任何CDB资源计划指令的PDB提供默认资源配置。默认资源计划指令可通过UPDATE_CDB_DEFAULT_DIRECTIVE进行调整。
PDB级资源管理:
用于精细化控制PDB本地的资源分配策略,具体操作请查阅配置资源管理。
# CDB全局资源类型
| 资源分类 | 参数 | 描述 |
|---|---|---|
| CPU资源 | SHARES | 在PDB间按比例分配CPU资源。 |
| UTILIZATION_LIMIT | 通过比例值上限控制每个PDB可使用的CPU资源,防止某个PDB过度占用资源而影响其他PDB的正常使用。 CPU资源的总量默认为数据库所在服务器的全部CPU资源。 | |
| IOPS资源 | SHARES | 在PDB间按比例分配IOPS资源。 可在根容器中通过MAX_IOPS和MAX_BPS参数配置允许使用的每秒最大IO操作次数上限基数、每秒最大读写字节数上限基数。 |
| UTILIZATION_LIMIT | 通过比例值上限控制每个PDB可使用的IOPS资源,防止某个PDB过度占用资源而影响其他PDB的正常使用。 可在根容器中通过MAX_IOPS和MAX_BPS参数配置数据库所在服务器支持的每秒最大IO操作次数以及每秒最大读写字节数。 | |
| 并行执行资源 | PARALLEL_SERVER_LIMIT | 用于兼容性支持,提供对并行处理资源的限制管理。 |
| 内存资源 | MEMORY_LIMIT | 通过比例值上限控制每个PDB可使用的物理内存总量占比。 整个CDB可使用的物理内存总量可通过根容器中的CDB_MAX_MEMORY_SIZE参数指定,若该参数配置为0(默认值),则表示上限为数据库所在服务器总物理内存的80%。 |
| MEMORY_MIN | 通过比例值下限确保PDB获得必要的内存资源,避免因配置不当导致PDB无法正常启动的问题。 |

