目录
一、常用参数
二、OBserver内存结构
1、 OBserver系统内存构成
2、租户内存
3、常见内存问题处理:外部客户常见报错处理
1)ERROR 4030 (HY000):OB-4030:Over tenant memory limits
2) 500租户内存超限
3) alloc memory 或 allocate memory 相关的报错
4)PLANCACHE命中率低于90%
4、参数相关总览
一、常用参数
- memory_limit_percentage
#设置observer占用服务器的总内存百分百数(可以是物理机或者Docker等)。
- memory_limit
#设置observer占用服务器的内存量总量,当memory_limit=0时 memory_limit_percentage 才生效。
- system_memory
#系统内部内存,memory_limit 或memory_limit_percentage分配给observer的内存并不能够全部分配给租户使用,还要有一部分给observer本身的程序使用,可分配给一般租户的内存为:
observer总内存 - system_memory -系统租户内存
- memstore_limit_percentage
#决定memstore占用租户总内存的百分比,默认值是50%
- freeze_trigger_percentage
#当memStore内存使用量超过freeze_trigger_percentage的百分比时(默认70%),会触发冻结及后续转储或者合并行
二、OBserver内存结构
1、 OBserver系统内存构成
Total Memory | |||||
OBserver Memory | OS Memory | ||||
Tenant | system memory | ||||
Memstore | KVcatch | ||||
PLAN CATCH | |||||
SQL AREA | |||||
WORK AREA | |||||
Other AREA |
2、租户内存
每个租户内存总体上分为两个部分
- 不可动态伸缩内存:Memstore
- 可动态伸缩的内存:KVstore
Memstore
Memstore用来存储DML产生的增量数据,空间不可被占用;KVstore内存可以被其他众多的内存模块占用。
Memstore 的内存大小有由参数memstore_limit_percentage决定,表示租户Memstore占用租户总内存的百分比。默认值是50及占用租户总内存的50%。
当Memstore占用的总内存超过freeze_tirgger_percentge设定的百分比时(默认70%),会触发冻结及后续的转储合并行为。
KVstore
保存来着SSTable的热数据,提高查询速度。
大小可动态伸缩,会被其他各种cache挤占。
3、常见内存问题处理:外部客户常见报错处理
1)ERROR 4030 (HY000):OB-4030:Over tenant memory limits
a)判断内存是否超过上限
select /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) */ TENANT_ID,IP,
round(ACTIVE/1024/1024/1024,2)ACTIVE_GB,
round(TOTAL/1024/1024/1024,2) TOTAL_GB,
round(FREEZE_TRIGGER/1024/1024/1024,2) FREEZE_TRIGGER_GB,
round(TOTAL/FREEZE_TRIGGER*100,2) percent_trigger,
round(MEM_LIMIT/1024/1024/1024,2) MEM_LIMIT_GB
from gv$memstore
where tenant_id >1000 or TENANT_ID=1
order by tenant_id,TOTAL_GB desc;
查看TOTAL_GB是否已经达到MEM_LIMIT_GB,即已将Memstore全部写满。
gv$memstore视图用于展示所有服务器上所有租户MEMTable上使用内存的情况。
b)如果MemStore未超限,判断MemStore之外那个model占用内存最高
select tenant_id, svr_ip, mod_name, sum(hold) module_sum
from __all_virtual_memory_info
where tenant_id>1000 and hold<>0 and
mod_name not in ('OB_KVSTORE_CACHE', 'OB_MEMSTORE')
group by tenant_id,svr_ip, mod_name
order by module_sum desc;
查看排名靠前的内存模块。
__all_virtual_memory_info表展示OBServer内存标签的统计信息
c)除去MemStore和KVCache,查看使用超过内存一定大小(比如10G)的模块
select *
from gv$memory
where used > 1024*1024*1024*10
and CONTEXT not in ('OB_MEMSTORE','OB_KVSTORE_CACHE')
order by used desc;
2) 500租户内存超限
tenant_id=500的租户是OB内部租户,简称500租户。
500租户的内存使用量没有被v$memory和gv$memory统计,需要单独查询__all_vritual_memory_info表
select svr_ip,mod_name,sum(hold) system_memory_sum
from __all_virtual_memory_info
where tenant_id=500 and hold<>0
group by svr_ip,mod_name
order by system_memory_sum desc;
3) alloc memory 或 allocate memory 相关的报错
报错原因,通常是系统内存耗尽或者达到了内存使用的上限。
4)PLANCACHE命中率低于90%
除了跑批外,如果是OLTP系统plancache命中率不应低于90%。
select hit_count,executions,(hit_count/executions) as hit_ratio
from v$plan_cache_plan_stat
where (hit_count/executions) < 0.9;
select hit_count,executions,(hit_count/executions) as hit_ratio
from v$plan_cache_plan_stat
where (hit_count/executions) < 0.9 and executions > 1000;
v$plan_cache_plan_stat 视图记录了当前租户在当前 Server 上的计划缓存中缓存的每一个缓存对象的状态。
gv$plan_cache_plan_stat 视图记录了当前租户在所有 Server 上的计划缓存中缓存的每一个缓存对象的状态。
4、参数相关总览
序号 | 名称 | 含义 | 计算公式 |
1 | Max_Memory | 租户最大可用内存 | 租户创建过程中设定的 |
2 | Sys Memory | 500租户内存上限 | 默认配置30G |
3 | Work_Area | 租户工作区内存 | 默认是租户内存的5% ob_sql_work_area_percentage |
4 | Active Memory Used | 活跃MemTable占用的内存 | 实时统计 |
5 | Total Memory Used | Memstore总体占用的内存 | active + frozen memory |
6 | memstore_limit_percentage | 租户内存最大可用给memstore的比例 | 默认是50% |
7 | freeze_trigger_percent | 基于Memstore_limit, Memstore触发冻结的百分比 | 默认70% |