memory-usage-high-water
参数
在官方文档中,未找到关于该配置参数的官方说明 。在专栏文章 《TiKV主要内存结构和OOM排查总结》 与 ASKTUG 《TiKV内存使用率过高》 描述该参数可限制 TiKV 可使用的最高内存,默认为物理内存的 90%。并且 show config where type='tikv' and name like '%memory%'
可查看到该参数默认值为 0.9
memory-usage-limit
参数
在官方文档中,未找到关于该配置参数的官方说明 。只在 TiDB v5.3.0 发版说明 中有简要的介绍。该参数为根据 storage.block-cache.capacity
参数值计算而来。该参数可否用于限制 TiKV 的内存使用量?
tikv_servers.resource_control.memory_limit
参数
该参数直接将内存限制写入到 systemd 的 service 文件中。
storage.block-cache.capacity
参数,控制 RocksDB Block Cache Size 大小,间接限制 TiKV 内存使用量。
以上四种限制 TiKV 内存使用量的参数,优先级从大到小依次是怎样的?
memory-usage-hight-water 参数对用户是隐藏的,默认如您所说,改为了 0.9,且不支持在线更新;
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 实际内存使用量会大于统计出来的值;
systemd 是通过 cgroup 来限制,所以被管理的进程其内存的回收权交由操作系统来决定;
上面 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 后,若不符合上面例子中计算出来的比例,需要先确定:
是否是操作系统参数导致的,比如是否开启并使用了 THP,page size 是否大于 4K,比如 aarch64 RHEL 发行版默认 64KB,如前面所说,TiKV 内部是按字节统计,可能存在因 page size 过大,因内部内存碎片产生了较大的偏差;
若排除系统参数因素,设置 4 不能有效控制 TiKV 内存使用,请通过 3 来控制 TiKV 内存,超出 limit 时,操作系统会进行内存回收,必要时会触发 cgroup 级别的 oom-killer 来回收内存;并辛苦您在空闲时提交一个 issue 及复现步骤,我们将进行复现并改进 4。
期望此回复对您能有所帮助,期待您的回复,谢谢!
3 个赞
system
(system)
关闭
2022 年11 月 15 日 02:13
5
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。