TiKV 内存占用异常

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:
    Release Version: v4.0.2\nEdition: Community
    Git Commit Hash: 328b6d0a955c4668cf3188d02a6df42e16eaab4e
    Git Branch: heads/refs/tags/v4.0.2
    UTC Build Time: 2020-07-01 08:19:48
    GoVersion: go1.13
    Race Enabled: false
    TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
    Check Table Before Drop: false
  • 【问题描述】:
    TiKV 使用默认配置,理论上内存占用是 45% block-cache内存 + 2.5G write-buffer,但在导数时经常达到80+%,是否有其他大的内存占用,和相关参数调整

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

  1. 你这里 80%+ 是包含了操作系统 buffer/cache 的使用率吗?
  2. 请问下是通过什么方式导数据的?

1、使用top 显示是80%+,即64G占用了50多G;
2、使用loader 工具;

top 中的 80% 是包含了操作系统本身的缓存,这个是正常情况,如果想减少 loader 导数时的内存占用情况可以考虑降低导入时的线程数(由参数 pool-size 控制)。

导入线程数以及调得比较低(6个),能否像Java xmx 一样限制最大内存使用?
现在出现的问题是内存占用过高导致 kswapd0 过高,CPU负载太大系统卡顿

loader 不支持配置最大内存使用,目前 loader 已经不再维护了,其功能已经完全被 tidb-lightning 的 tidb benckend 模式替代, 如果有大数据量导入的需求建议使用 tidb-lightning 工具。

能否支持限制tikv 的最大内存,目前的设置
45% block-cache内存 + 2.5G write-buffer
不能限制tikv 内存,导致服务器负载太大影响使用

可以通过参数 storage.block-cache.capacity 来设置 tikv 使用的 block_cache 大小:

block_cache 看监控最大是只有30G(45%左右)是符合预期的,但是top上tikv进程内存占用50G+,剩下的内存是哪块使用的,能否限制

除了以上列出的 block-cache 以及 write-buffer 会占用系统内存外,还有下面两部分会占内存,这个不太好限制:

  1. 需预留一些内存作为系统的 page cache
  2. TiKV 在处理大的查询的时候(例如 select * from ... )会读取数据然后在内存中生成对应的数据结构返回给 TiDB,这个过程中 TiKV 会占用一部分内存

另外如果不是单机多实例部署,一般不需要调整这些参数,设置的太小会影响集群的查询效率。

这两部分描述有点模糊,确定下如果占用几十G (loader导入几十G数据时)也是可能的吗
或者什么方法可以确认是哪个模块占用了这些内存

TiKV 除了自身的 block cache 和 write buffer 会占用内存外,也是需要使用操作系统缓存的。如果前端有很多大查询 SQL,且部分查询的数据在内存中不存在,那需要将 KV 底层 SST 文件中的数据先读取到操作系统 page cache ,然后再加载到 block cache 中, 这时就可能导致总体内存使用率很高了。

意思是page cache 可能占用数十G内存吗

还有一个问题,这个能否配置page cache使用限制,我们是导数时才发生,平常读数据量不算很大

这个是有可能的,目前这一块不是很好限制,这个是操作系统级别的。