关于限制TiKV实例内存使用的参数都有哪些?

  1. memory-usage-high-water 参数
    在官方文档中,未找到关于该配置参数的官方说明。在专栏文章 《TiKV主要内存结构和OOM排查总结》 与 ASKTUG 《TiKV内存使用率过高》描述该参数可限制 TiKV 可使用的最高内存,默认为物理内存的 90%。并且 show config where type='tikv' and name like '%memory%'可查看到该参数默认值为 0.9

  2. memory-usage-limit 参数
    在官方文档中,未找到关于该配置参数的官方说明。只在 TiDB v5.3.0 发版说明 中有简要的介绍。该参数为根据 storage.block-cache.capacity 参数值计算而来。该参数可否用于限制 TiKV 的内存使用量?

  3. tikv_servers.resource_control.memory_limit 参数
    该参数直接将内存限制写入到 systemd 的 service 文件中。

  4. storage.block-cache.capacity 参数,控制 RocksDB Block Cache Size 大小,间接限制 TiKV 内存使用量。

以上四种限制 TiKV 内存使用量的参数,优先级从大到小依次是怎样的?

  1. memory-usage-hight-water 参数对用户是隐藏的,默认如您所说,改为了 0.9,且不支持在线更新;
  2. memory-usage-limit 参数是为了限制 TiKV 内部各个组件的内存使用,并根据系统的总内存和 reject_messages_on_memory_ratio 计算 raft messages 被 rejected 的大小。若 TiKV 实际使用内存超过 memory_usage_high_water 时,TiKV 会限制自身内存增长,比如根据 reject_messages_on_memory_ratio 计算出来的值 reject raft message。这里统计内存使用时是根据字节而不是 page size 来统计的。所以 TiKV 实际内存使用量会大于统计出来的值;
  3. systemd 是通过 cgroup 来限制,所以被管理的进程其内存的回收权交由操作系统来决定;
  4. 上面 1 和 2 设计的初衷是让用户聚焦在 storage.block-cache.capacity 即可 (因为这两者皆由此参数计算出来的);

优先级:
理论上只需要关注 4,比如:

  • system=8G, block-cache=3.6G, memory-usage-limit=6G, high-water=5.4G, page-cache=2G.
  • system=16G, block-cache=7.2G, memory-usage-limit=12G, high-water=10.8G, page-cache=4G
  • system=32G, block-cache=14.4G, memory-usage-limit=24G, high-water=21.6G, page-cache=8G

设置 4 后,若不符合上面例子中计算出来的比例,需要先确定:

  1. 是否是操作系统参数导致的,比如是否开启并使用了 THP,page size 是否大于 4K,比如 aarch64 RHEL 发行版默认 64KB,如前面所说,TiKV 内部是按字节统计,可能存在因 page size 过大,因内部内存碎片产生了较大的偏差;
  2. 若排除系统参数因素,设置 4 不能有效控制 TiKV 内存使用,请通过 3 来控制 TiKV 内存,超出 limit 时,操作系统会进行内存回收,必要时会触发 cgroup 级别的 oom-killer 来回收内存;并辛苦您在空闲时提交一个 issue 及复现步骤,我们将进行复现并改进 4。

期望此回复对您能有所帮助,期待您的回复,谢谢!

3 个赞

总结比较到位:+1:

感谢热心回复。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。