租户内存使用率持续告警(接近memstore_limit),应如何系统性地排查与释放?

生产环境中,偶尔会遇到租户内存使用率持续走高,接近参数 memstore_limit 的情况,导致写入被限流甚至拒绝。这通常不是单一原因造成的。

希望集思广益,探讨一个系统性的排查流程:

  1. 根源分析 :除了查看 __all_virtual_memory_info ,还有哪些关键视图(如 GV$OB_MEMSTOREGV$SQL_AUDIT )能帮助我们快速定位是活跃事务未提交大版本冻结未合并 ,还是存在内存泄漏性质的SQL (如大量内存排序)?
  2. 应急处理 :在业务高峰时,如果必须紧急缓解内存压力,除了常规的查找并终止会话外,调整 freeze_trigger_percentage 等合并参数 是否是一个安全有效的在线操作?有何潜在风险?
  3. 预防策略 :如何为不同的负载模式(如频繁DML vs. 大查询)合理设置租户的 memstore_limitfreeze_trigger_percentage ?是否有基于监控数据的调优公式或最佳实践?

期待DBA同仁们分享实战中的排查清单和“止血”步骤,这对我们构建稳健的运维体系非常关键。

【标签】 #内存管理 #故障排查 #性能调优 #生产运维

3 个赞

期待答案

1、可以查看memstore使用情况
select round(ACTIVE_SPAN/1024/1024/1024,2) as ACTIVE_SPAN_GB , round(FREEZE_TRIGGER/1024/1024/1024,2) as FREEZE_TRIGGER_GB, round(MEMSTORE_USED/1024/1024/1024,2) as MEMSTORE_USED_GB , round(MEMSTORE_LIMIT/1024/1024/1024, 2) as MEMSTORE_LIMIT_GB from GV$OB_MEMSTORE where tenant_id = 1002;
– 查看内存各模块占用
SELECT
ctx_name,
SUM(hold) AS total_hold,
ROUND(SUM(hold) / 1024.0 / 1024.0, 2) AS total_mb,
SUM(count) AS total_count
FROM oceanbase.__all_virtual_memory_info
WHERE tenant_id = 1002
GROUP BY ctx_name
ORDER BY total_hold DESC;

---- 找出占用 memstore 最多的 tablet
SELECT
ttl.table_id,
ttl.tablet_id,
ttl.ls_id,
COUNT(*) AS memstore_count,
SUM(CASE WHEN tma.is_active = 1 THEN 1 ELSE 0 END) AS active_count
FROM oceanbase.__all_virtual_tablet_to_ls ttl
LEFT JOIN oceanbase.__all_virtual_tenant_memstore_allocator_info tma
ON ttl.tenant_id = tma.tenant_id
AND ttl.tablet_id = tma.tablet_id
AND ttl.ls_id = tma.ls_id
WHERE ttl.tenant_id = 1002
GROUP BY ttl.table_id, ttl.tablet_id, ttl.ls_id
HAVING active_count > 0
ORDER BY active_count DESC
LIMIT 20;

应急的话:
1、可以手动触发 Minor Freeze
– 持续监控 memstore 使用率
SELECT memstore_used, memstore_limit,
ROUND(memstore_used * 100.0 / NULLIF(memstore_limit, 0), 2) AS usage_pct
FROM oceanbase.__all_virtual_tenant_memstore_info
WHERE tenant_id = 1002;
–查看长时间运行的事务(可能阻塞 memstore 释放)
SELECT count(1)
FROM GV$OB_TRANSACTION_PARTICIPANTS
WHERE CTX_CREATE_TIME < date_sub(now(), INTERVAL 600 SECOND)
AND STATE = ‘INIT’;

可以优化的:

  • 批量写入,减少小事务

  • 避免长时间未提交的事务

  • 合理设置 major_compact_trigger

1 个赞

谢谢答复,对我有帮助

1 个赞