---
title: cache_hold 与 cache wash 机制说明-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 cache_hold 与 cache wash 机制说明相关的常见问题和使用技巧，帮助您快速解决 cache_hold 与 cache wash 机制说明的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# cache_hold 与 cache wash 机制说明

更新时间：2026-05-08 08:11

适用版本： V2.1.x、V2.2.x、V3.1.x、V3.2.x 内容类型：TechNote  

## 适用版本

OceanBase 数据库 V2.x、V3.x 版本。

## cache_hold

个别租户内存占用过大时，发现是 cache_hold 占用过高（如下）， 某些情况下会触发 OCP 的告警，提示该租户占用内存过大，在 `observer.log` 的内存统计信息 `ob_malloc_allocator` 可以看到类似这样的日志。

```shell
[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 筛选对应租户即可)。

```shell
[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。

```shell
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]。

​

上一篇

[因 sql_work_area 不足导致 SQL 报错 -4013 的原因和解决方法](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002397183)

下一篇

[OceanBase 数据库的 SSTable Cache 淘汰和清空逻辑](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000209947) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
