- 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。
期望此回复对您能有所帮助,期待您的回复,谢谢!