tikv服务器共享内存配置问题

【TiDB 使用环境】生产环境
【TiDB 版本】6.5.1
【部署方式】私有化部署
【遇到的问题:问题现象及影响】
有三个tikv节点,每个节点配置了共享block-cache,其中一个节点的数据如下,具体如图所示:
tikv 10.251.76.12:20160 storage.block-cache.capacity 16GiB


查询10.251.76.12配置的所有block-cache,具体如下:

tikv 10.251.76.12:20160 storage.block-cache.shared true
tikv 10.251.76.12:20160 storage.block-cache.memory-allocator nodump
tikv 10.251.76.12:20160 raftdb.defaultcf.disable-block-cache false
tikv 10.251.76.12:20160 rocksdb.defaultcf.disable-block-cache false
tikv 10.251.76.12:20160 rocksdb.lockcf.disable-block-cache false
tikv 10.251.76.12:20160 rocksdb.raftcf.disable-block-cache false
tikv 10.251.76.12:20160 rocksdb.writecf.disable-block-cache false
tikv 10.251.76.12:20160 storage.block-cache.strict-capacity-limit false
tikv 10.251.76.12:20160 raftdb.defaultcf.prepopulate-block-cache disabled
tikv 10.251.76.12:20160 rocksdb.defaultcf.prepopulate-block-cache disabled
tikv 10.251.76.12:20160 rocksdb.lockcf.prepopulate-block-cache disabled
tikv 10.251.76.12:20160 rocksdb.raftcf.prepopulate-block-cache disabled
tikv 10.251.76.12:20160 rocksdb.writecf.prepopulate-block-cache disabled
tikv 10.251.76.12:20160 storage.block-cache.num-shard-bits 6
tikv 10.251.76.12:20160 rocksdb.defaultcf.block-cache-size 20GiB
tikv 10.251.76.12:20160 rocksdb.lockcf.block-cache-size 1GiB
tikv 10.251.76.12:20160 storage.block-cache.capacity 16GiB
tikv 10.251.76.12:20160 raftdb.defaultcf.block-cache-size 1638MiB
tikv 10.251.76.12:20160 rocksdb.writecf.block-cache-size 12GiB
tikv 10.251.76.12:20160 rocksdb.raftcf.block-cache-size 128MiB
tikv 10.251.76.12:20160 storage.block-cache.high-pri-pool-ratio 0.8
![image 607x458](upload://6Yfwr1N1hPUWGsFm40pitKSBqiR.png)
进行tidb数据库访问时,经常出现OOM的错误。我想请问,这块配置的是否有问题,应该如何修改?
查看tikv运行状态时,出现的结果如下:
tikv-20160.service - tikv service
Loaded: loaded (/etc/systemd/system/tikv-20160.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2025-03-17 18:57:33 CST; 1 years 4 months ago
Main PID: 8440 (tikv-server)
Memory: 79.9G (limit: 80.0G)
CGroup: /system.slice/tikv-20160.service
└─8440 bin/tikv-server --addr 0.0.0.0:20160 --advertise-addr10.251.76.12:20160–status-addr 0.0.0.0:20180 --advertise-status-addr10.251.76.12:20180–pd 10.251.76.13:2379,10.251.76.14:2379,…

TiKV 整机内存规划公式:

Block Cache = 物理内存 × (50% ~ 60%) 其余内存:write buffer、raft 日志、排队内存、系统预留

举例:服务器物理内存 32G → block-cache 推荐 16G(你当前配置刚好是标准最优值) 服务器物理内存 64G → block-cache 设置 32G 左右

TiKV没有OOM,如果是TiDB的OOM,那和TiKV关系也不大,要去分析TiDB的OOM的原因,优化SQL。

建议检查下storage.block-cache.capacity设置为16GiB是否合理。按经验,这个值通常设为机器总内存的30%-50%,留足给操作系统和其他进程。

如果节点内存足够,可以试试把storage.block-cache.strict-capacity-limit设为true,避免缓存打满后性能抖动。另外确认下三个节点的内存配置是否一致,共享block-cache模式下每个节点独立管理自己的缓存。

Memory: 79.9G (limit: 80.0G)
有问题吧,你观察下内存实际占用

找出消耗内存最大的 SQL、调整GC参数

Block Cache 的内存配置总和已经超出了 TiKV 进程的实际内存限制

学习了

在 Linux 系统中,如果没有开启 Swap(交换空间),当物理内存耗尽时,系统会直接触发 OOM Killer 杀掉占用内存最大的进程。

dashboard上看慢SQL,调整 Block Cache为60%最好。

TiKV 整机内存规划公式:

Block Cache = 物理内存 × (50% ~ 60%) 其余内存:write buffer、raft 日志、排队内存、系统预留

举例:服务器物理内存 32G → block-cache 推荐 16G(你当前配置刚好是标准最优值) 服务器物理内存 64G → block-cache 设置 32G 左右

shared=true 表示该 TiKV 进程内多 CF 共用一块 block-cache,容量看 storage.block-cache.capacity,不是三台机器共享内存。每节点各自配置;同机多实例要按内存总和留余量,避免超配 OOM。