首批通过分布式安全可靠测评,为关键业务系统打造
cache_hold 与 cache wash 机制说明
更新时间:2026-05-08 08:11
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
cache_hold
个别租户内存占用过大时,发现是 cache_hold 占用过高(如下), 某些情况下会触发 OCP 的告警,提示该租户占用内存过大,在 observer.log 的内存统计信息 ob_malloc_allocator 可以看到类似这样的日志。
[2022-09-30 12:18:02.958572] INFO [LIB] ob_malloc_allocator.cpp:505 [19513][4][Y0-0000000000000000] [lt=5] [dc=0] [MEMORY] tenant: 500, limit: 9,223,372,036,854,775,807 hold: 108,471,558,144 rpc_hold: 0 cache_hold: 72,597,110,784 cache_used: 72,597,110,784 cache_item_count: 34,617
对于 cache_hold 的告警处理
cache_hold 和 cache_used 指的是该租户的 KV Cache 占用信息,可以在 __all_virtual_kvcache_info 表中看到,也可以在日志中看到(关键字 CACHE 筛选对应租户即可)。
[CACHE] tenant_id= 500 | cache_name= schema_cache | cache_size= 72825469376 | cache_store_size= 72594895296 | cache_map_size= 230574080 | hold_size= 0
OceanBase 数据库的内存管理模式决定,一般情况下 cache_hold 无论占用多高都没什么问题,因为当租户内存不足时,OceanBase 数据库会尝试 wash KV Cache 的内存。
当出现在通过日志或者虚拟表确认了 cache_hold 的类型后,确认系统没有申请内存失败的 4013/4030 等错误,也没有 wash 内存失败的错误,即可忽略告警。
KV Cache wash 过程
KV Cache 腾出自身内存的过程称为 wash,cache 的 wash 行为分为同步 wash 和异步 wash 两种。
- 同步 wash 就是 sync wash,cache 找到没有被 pin 住的 memblock,释放内存。
- 异步 wash 由一个后台 wash 线程完成,wash 线程会定期地根据每个租户的内存压力 (包括租户大小、当前 cache 大小、租户当前空闲内存等) 计算出租户应该 wash 出的 cache size,然后再根据每个 memblock 的访问热度从低到高 wash。如果压力不大,计算结果可能是 0,则不做 wash。
可以根据如下日志来判断,如果有则表示 wash 线程异步 wash 了 memblock。
COMMON_LOG(INFO, "Wash memory, ",
"tenant_id", wash_iter->first,
"cache_size", tenant_wash_info->cache_size_,
"lower_mem_limit", tenant_wash_info->lower_limit_,
"upper_mem_limit", tenant_wash_info->upper_limit_,
"min_wash_size", tenant_wash_info->min_wash_size_,
"max_wash_size", tenant_wash_info->max_wash_size_,
"mem_usage", lib::get_tenant_memory_hold(wash_iter->first),
"reserve_mem", static_cast<int64_t>((static_cast<double>(tenant_wash_info->upper_limit_)) * tenant_reserve_mem_ratio_),
"wash_size", tenant_wash_info->wash_size_);
触发 Cache wash 的条件
OBServer 的 KVcache 会尽可能地多用内存,并且能自动挤占,KVcache 在以下几种情况下会触发 wash:
- 内存申请不出来时。
- 进程剩余内存不足
cache_wash_threshold时。 - 租户内存(max_memory)使用到达 90% 时。
cache_wash_threshold参数用于设置触发缓存清理的容量阈值。如果内存空间小于指定值时,内存空间将被清理。
| 属性 | 描述 |
|---|---|
| 参数类型 | 容量单位 |
| 默认值 | 4GB |
| 取值范围 | [0, +∞) |
| 是否重启 OBServer 生效 | 否 |
Cache wash 的时间周期
通过配置项 _cache_wash_interval 来控制检测周期,默认是 200ms,取值范围为 [1ms,1m]。