问题描述
租户的 freeze_trigger 动态变化。
查询租户在物理机上的资源使用情况,执行语句如下。
obclient> SELECT now(),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_trg_gb, round(mem_limit/1024/1024/1024,2) mem_limit_gb, freeze_cnt , round((active/freeze_trigger),2) freeze_pct, round(total/mem_limit, 2) mem_usage FROM oceanbase.gv$memstore WHERE tenant_id =xxxx ORDER BY tenant_id, ip;
输出结果如下。
+---------------------+-----------+-------------+-----------+----------+---------------+--------------+------------+------------+-----------+
| now() | tenant_id | ip | active_gb | total_gb | freeze_trg_gb | mem_limit_gb | freeze_cnt | freeze_pct | mem_usage |
+---------------------+-----------+-------------+-----------+----------+---------------+--------------+------------+------------+-----------+
|xxxx-xx-xxxx xx:xx:xx| xxxx | xx.xx.xx.xx | 1.40 | 1.41 | 22.40 | 32.00 | 0 | 0.06 | 0.04 |
|xxxx-xx-xxxx xx:xx:xx| xxxx | xx.xx.xx.xx | 1.39 | 1.39 | 22.40 | 32.00 | 0 | 0.06 | 0.04 |
|xxxx-xx-xxxx xx:xx:xx| xxxx | xx.xx.xx.xx | 0.19 | 0.19 | 5.84 | 32.00 | 75 | 0.03 | 0.01 |
+---------------------+-----------+-------------+-----------+----------+---------------+--------------+------------+------------+-----------+
3 rows in set (0.02 sec)
一段时间再次执行语句输出结果如下。
+---------------------+-----------+-------------+-----------+----------+---------------+--------------+------------+------------+-----------+
| now() | tenant_id | ip | active_gb | total_gb | freeze_trg_gb | mem_limit_gb | freeze_cnt | freeze_pct | mem_usage |
+---------------------+-----------+-------------+-----------+----------+---------------+--------------+------------+------------+-----------+
|xxxx-xx-xxxx xx:xx:xx| 1002 | xx.xx.xx.xx | 1.41 | 1.41 | 22.40 | 32.00 | 0 | 0.06 | 0.04 |
|xxxx-xx-xxxx xx:xx:xx| 1002 | xx.xx.xx.xx | 1.39 | 1.39 | 22.40 | 32.00 | 0 | 0.06 | 0.04 |
|xxxx-xx-xxxx xx:xx:xx| 1002 | xx.xx.xx.xx | 0.19 | 0.19 | 17.15 | 32.00 | 75 | 0.01 | 0.01 |
+---------------------+-----------+-------------+-----------+----------+---------------+--------------+------------+------------+-----------+
观察到租户内存触发冻结阈值 freeze_trg_gb 从 5.84GB 动态变化成 17.15GB,MemStore 冻结的百分比 freeze_pct 从 0.03 动态变化成 0.01。
若在 OceanBase 数据库 V4.x 版本,查询租户在物理机上的资源使用情况,执行语句如下。
SELECT now(),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_trg_gb, round(MEMSTORE_LIMIT/1024/1024/1024,2) mem_limit_gb, freeze_cnt,round((ACTIVE_SPAN/freeze_trigger),2) freeze_pct, round(MEMSTORE_USED/MEMSTORE_LIMIT, 2) mem_usage FROM oceanbase.GV$OB_MEMSTORE WHERE tenant_id =1002 ORDER BY TENANT_ID, SVR_IP;
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
问题原因
租户的 freeze_trigger 动态变化,通常是租户内其他内存模块占用总内存量大小引发的,需要查看租户的内存占用情况,可以找到异常大量占用内存资源的内存模块。
解决方法
确定租户中占用大量内存的原因,方法如下。
通过
__all_virtual_memory_info系统表查询 OceanBase 数据库各个 Mod 的内存消耗情况(MemStore 内存未超限),执行如下查询语句。obclient> SELECT tenant_id,svr_ip,sum(hold) module_sum FROM oceanbase.__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;注意
内存模块超限的判断标准是 module_sum > 租户 min_memory - 租户 MemStore。
通过结合
observer.log日志中有关 tenant_id(租户编号)及 mod_id (内存模块编号) 的信息,执行如下语句查询获取具体的内存模块信息(内存模块超限)。obclient> select * from oceanbase.__all_virtual_memory_info where mod_id=xxx and tenant_id = xxx;
说明
freeze trigger 的动态变化本身不需要解决,如果发现其他模块的内存变大的异常导致了其他的问题,或者转储太过于频繁,需要通过对应手段降低其他模块的内存