百亿表CDC同步致TiKV节点内存一直涨问题

背景

某TiDB集群高TPS 2张表(一张表226亿,一张表21亿)有CDC同步(6号晚上在归档226亿表引起TiKV机器内存涨了5G),最近30天TiKV机器内存使用一直涨

某TiKV存储节点机器内存使用

分析

版本信息

TiDB集群:Cluster version: v5.1.4

CDC:Release Version: v5.1.4

TiKV机器配置为3.7T NVME磁盘

参数配置方面

  • 每个TiKV存储节点block-cache都为12G(64G内存机器)

  • 存储节点机器独立部署TiKV,TiKV节点自身内存使用率76%

  • TiKV存储节点机器透明大页一直是关闭

cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

TiDB CDC同步表特点

  • 流水类 短时间有高TPS写入,写多读少(高峰期insert 4~5w数据量/秒)

  • 批量inset每次100~200条数据

  • 6号CDC 写到下游数据变更行最高为4.2w左右,7号CDC迁移到高内存机器后写到下游数据变更行最高为7.8w

TiKV进程主要内存组成

主要为block_cache,但目前TiKV block_cache为12G,远远没有达到TiKV进程50G左右内存占用

Grafana监控CDC-TiKV中发现另外TiKV节点CDC相关 组件 有大部分内存消耗:

  • process_resident_memory_bytes-tikv_engine_block_cache_size_bytes(每个TiKV节点有34G内存左右消耗),TiKV进程50G内存消耗有大部分内存是非block_cache部分消耗即TiKV CDC 组件

TiKV节点非block_cache部分内存消耗

  • tikv_cdc_sink_memory_bytes(内存很小)

缓存old value的大小

  • tikv_cdc_old_value_cache_bytes(内存很小)

缓存在tikv中等待下发的cdc change event大小

推测

TiKV机器内存一直涨问题排查推测由于TiKV CDC组件占用大部分内存导致,疑问是为啥TiKV CDC组件占用内存会一直涨,有无在线的方法能释放TiKV CDC组件内存

专栏 - TiCDC 架构和数据同步链路解析 | TiDB 社区 TiCDC 架构和数据同步链路解析

专栏 - TiKV主要内存结构和OOM排查总结 | TiDB 社区 TiKV主要内存结构和OOM排查总结

https://docs.pingcap.com/zh/tidb/v5.1/ticdc-overview TiCDC 简介

目前通过已知现象推测 TiCDC 组件可能会占用大量的内存,能否通过 TiKV 抓取火焰图方式,再实锤一下 TiCDC 内存占用情况?
方式一: https://cn.pingcap.com/blog/flame-graph
方式二:通过 TiDB Dashboard 使用 profiling 抓取一下 TiKV 内存消耗的火焰图 https://docs.pingcap.com/zh/tidb/v5.1/dashboard-profiling

1 个赞

TiKV火焰图已上传
mem

从火焰图看 CDC 内存消耗比较低,


Unified pool 的内存占用达到 20%

可以查看排查一下慢查询 SQL