OB系统内部内存
每一个observer都包含多个租户(sys租户 & 非sys租户)的数据,但observer的内存并不是全部分配给租户。
observer中有些内存不属于任何租户,属于所有租户共享的资源,称为“系统内部内存”,system_memory。
通过参数设定“系统内部内存”上限: system_memory
租户可用的总内存= “observer内存上限” – system_memory
租户内部的可用内存总体上分为两个部分:
1、不可动态伸缩的内存:MemStore (大小由参数memstore_limit_percentage决定,默认值为50,即占用租户内存的50%)
2、可动态伸缩的内存:KVCache,(其他Plan cache,Sql area,worker area,other area)
当MemStore内存使用超过freeze_trigger_percentage定义的百分比时(默认70%),触发冻结及后续的转储/合并等行为。
*常见内存问题处理:外部客户常见报错处理*
ERROR 4030 (HY000): OB-4030:Over tenant memory limits
eg1:判断MemStore是否超过上限
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全部写满
eg2:若MemStore内存未超限,判断是MemStore之外的哪个module占用内存空间最高
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;
查看排名靠前的内存模块。
eg3: 除去MemStore和KVCache,查看使用超过一定大小(比如10GB)的内存模块
select *
from gv$memory
where used > 1024*1024*1024*10
and CONTEXT not in ('OB_MEMSTORE','OB_KVSTORE_CACHE')
order by used desc;
查看排名靠前的内存模块。
内存表说明:
gv$memstore obServer固定内存区域情况
__all_virtual_memory_info 各个mod_name内存模块hold占用情况
gv$memory 各个CONTEXT内存模块used占用情况 (不统计系统租户?)