暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase 学习笔记107:常见内存问题有哪些?

502

问题一:超过租户内存限制怎么办?

ERROR 4030 (HY000): OB-4030:Over tenant memory limits

当您看到上述错误信息时,首先需判断是不是 MemStore 内存超限,当 MemStore 内存超限时,需要检查数据写入是否过量或未做限流。当遇到大量写入且数据转储跟不上写入速度的时候就会报这种错误。运行下述语句查看当前内存使用情况:

obclient> SELECT /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) */ TENANT_ID,SVR_IP,
           round(ACTIVE_SPAN/1024/1024/1024,2) ACTIVE_GB,
           round(MEMSTORE_USED/1024/1024/1024,2) TOTAL_GB,
           round(FREEZE_TRIGGER/1024/1024/1024,2) FREEZE_TRIGGER_GB,
           round(MEMSTORE_USED/FREEZE_TRIGGER*100,2) percent_trigger,
           round(MEMSTORE_LIMIT/1024/1024/1024,2) MEM_LIMIT_GB 
FROM oceanbase.GV$OB_MEMSTORE
WHERE tenant_id >1000 OR TENANT_ID=1
ORDER BY tenant_id,TOTAL_GB DESC;

该问题的紧急处理措施是增加租户内存,具体操作请联系技术支持人员协助处理。问题解决之后需要分析原因,如果是因为未做限流引起,需要加上相应措施,然后回滚之前加上的租户内存动作;如果确实因为业务规模增长导致租户内存不足以支撑业务时,需要根据转储的频度设置合理的租户内存大小;如果 MemStore 内存未超限,运行下述语句判断是哪个内存模块超限:

obclient> SELECT tenant_id,svr_ip,hold module_sum
FROM oceanbase.GV$OB_MEMORY
WHERE tenant_id>1000 AND hold<>0 AND
             context NOT IN ( 'OB_KVSTORE_CACHE','OB_MEMSTORE')
GROUP BY tenant_id,svr_ip;

内存模块超限的判断标准是 module_sum > (租户 memory_size - 租户 MemStore)。模块内存超限,可能需要先调整单独模块的内存,例如,调整 ob_sql_work_area_percentage 的值,如果租户内存过小,也需要增加租户内存。

系统变量名描述默认值生效范围
ob_sql_work_area_percentage租户工作区内存,是 SQL 排序等阻塞性算子使用的内存。5%Global

问题二:PLANCACHE 命中率低于 90% 怎么办?

如果是 OLTP 系统 PLANCACHE 命中率应不低于 90%,运行下述语句查看 PLANCACHE 命中率:

obclient> SELECT hit_count,executions,(hit_count/executions) as hit_ratio
FROM V$OB_PLAN_CACHE_PLAN_STAT
WHERE (hit_count/executions) < 0.9;

obclient> SELECT hit_count,executions,(hit_count/executions) AS hit_ratio
FROM V$OB_PLAN_CACHE_PLAN_STAT
WHERE (hit_count/executions) < 0.9 AND executions > 1000;

寻找是否有相似语句,例如 in 或 not in 后面的参数个数随机,导致大量浪费;如果不是上述情况,可能是因为业务量或会话激增导致内存不足,需要调整租户内存大小。

问题三:日志中有 fail to allocate memory 或 allocate memory fail 等信息怎么办?

日志中会包含 tenant_id (租户编号)及 context (内存模块)信息,可以通过以下语句查询具体的内存模块信息:

obclient> SELECT * FROM oceanbase.GV$OB_MEMORY WHERE context=xxx AND tenant_id = xxx

从问题一中可知,如果模块内存超限,需要先调整单独模块的内存。如果租户内容过小,需要增加租户内存。具体操作请联系技术支持人员协助处理。

问题四:500 租户内存超限

tenant_id =500 的租户是 OB 内部租户,简称 500 租户。正常情况下,该报错会多次出现,最可能是机器系统内存被耗光或当前机器剩余内存已被预分配,用户无法再扩展。

这种报错需要查看内存被占用情况,500 租户的内存使用量没有被 V$OB_MEMORY 统计,需要查询oceanbase.GV$OB_MEMORY 表,同时排查系统中内存的使用情况。如果是机器系统内存被耗光,判断是否为系统偶发情况。如果是,且同时没有业务影响,可等系统自行释放内存;如果有大的业务影响或系统正常进程活动导致内存被占用以及内存被预分配等情况,可考虑增加内存,具体操作请联系技术支持人员协助处理。

SELECT * FROM oceanbase.GV$OB_MEMORY WHERE tenant_id=500;
//排查系统内存使用命令
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论