vm虚拟机环境下Workload Group硬限制无效

Viewed 50

前情提要:
2.1.7-rc01,使用 Workload Group 设置cpu硬限制无效

我司使用vm虚拟化了3台机器用来部署doris。后面开启cpu硬限制发现无效,也在社区提了帖子。当时也和官方远程看过了,一时无解。后来想到了是不是vm虚拟化后的问题,然后gpt搜罗了一下。结合物理机的表现,发现我这里vm虚拟化后的机器缺少了一些cgroup所必须的组件:

cpufreq 是 CPU 频率调节子系统,如果它不存在,意味着你的系统可能没有启用 CPU 频率调节功能,或者使用了其他 CPU 频率管理方式。这会直接影响 cgroup 的 CPU 限制,因为 cgroup 的 CPU 限制是基于 CFS 调度器工作的,而 CFS 调度器通常与 cpufreq 协同工作。

检查 CPU 调度器: 使用 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 命令确认是否为 performance 或 powersave。如果是其他调度器,可能会影响 cgroup 的效果,建议设置为 performance。

这里我都没有cpufreq目录,应该是vm虚拟化后压根就没初始化这个组件.

lsmod | grep cpufreq 无输出

后面联系运维,并根据ai的建议检查:
虚拟化引擎: 在虚拟机的硬件设置中,找到“处理器”或“CPU”选项。确认虚拟化引擎设置为“Intel VT-x/EPT”或“AMD-V/RVI”(根据你的主机 CPU 品牌)。如果设置为“自动”,VMware 可能会根据主机配置选择不同的虚拟化模式,这可能会导致一些兼容性问题。建议明确指定虚拟化引擎。
性能计数器: 确保启用了“性能计数器”或类似的选项。这允许虚拟机访问主机 CPU 的性能计数器,这对于 CFS 的正常工作很重要。

这两个在vm或者bios启动的时候都设置过了,依旧无效。所以想问问官方有没有对于vm虚拟机部署doris并开启硬限制的指导配置,或者有遇到vm下硬限制的可行性反馈

2 Answers

目前主要是测试了物理机和容器内的cgroup,是可以工作的。
虚拟机目前没测过,稍后会找个环境测试下。
短期如果考虑落地要用硬限的话,可以试下修改修改属性scan_thread_num,这个参数的含义是控制某个workload group的scan线程数的数量,一个线程某一时刻只能使用一个核,因此这个参数可以间接限制cpu使用的核数,达到类似硬限的效果

  • cpu_share: 可选,默认值为 1024,取值范围是正整数。用于设置 workload group 获取 cpu 时间的多少,可以实现 cpu 资源软隔离。cpu_share 是相对值,表示正在运行的 workload group 可获取 cpu 资源的权重。例如,用户创建了 3 个 workload group g-a、g-b 和 g-c,cpu_share 分别为 10、30、40,某一时刻 g-a 和 g-b 正在跑任务,而 g-c 没有任务,此时 g-a 可获得 25% (10 / (10 + 30)) 的 cpu 资源,而 g-b 可获得 75% 的 cpu 资源。如果系统只有一个 workload group 正在运行,则不管其 cpu_share 的值为多少,它都可获取全部的 cpu 资源。

  • memory_limit: 可选,默认值 0%,不限制,取值范围 1%~100%,用于设置 workload group 可以使用 be 内存的百分比。Workload Group 可用的最大内存,所有 group 的累加值不可以超过 100%,通常与 enable_memory_overcommit 配合使用。如果一个机器的内存为 64G,mem_limit=50%,那么该 group 的实际物理内存=64G * 90%(be conf mem_limit) * 50%= 28.8G,这里的 90% 是 BE 进程级别的 mem_limit 参数,限制整个 BE 进程的内存用量。一个集群中所有 Workload Group 的 memory_limit 的累加值不能超过 100%。

  • enable_memory_overcommit: 可选,用于开启 workload group 内存软隔离,默认为 true。如果设置为 false,则该 workload group 为内存硬隔离,系统检测到 workload group 内存使用超出限制后将立即 cancel 组内内存占用最大的若干个任务,以释放超出的内存;如果设置为 true,则该 workload group 为内存软隔离,如果系统有空闲内存资源则该 workload group 在超出 memory_limit 的限制后可继续使用系统内存,在系统总内存紧张时会 cancel 组内内存占用最大的若干个任务,释放部分超出的内存以缓解系统内存压力。建议在有 workload group 开启该配置时,所有 workload group 的 memory_limit 总和低于 100%,剩余部分用于 workload group 内存超发。

  • cpu_hard_limit:可选,默认值 -1%,不限制。取值范围 1%~100%,CPU 硬限制模式下,Workload Group 最大可用的 CPU 百分比,不管当前机器的 CPU 资源是否被用满,Workload Group 的最大 CPU 用量都不能超过 cpu_hard_limit,
    所有 Workload Group 的 cpu_hard_limit 累加值不能超过 100%。2.1 版本新增属性,2.0版本不支持该功能。

  • max_concurrency:可选,最大查询并发数,默认值为整型最大值,也就是不做并发的限制。运行中的查询数量达到该值时,新来的查询会进入排队的逻辑。

  • max_queue_size:可选,查询排队队列的长度,当排队队列已满时,新来的查询会被拒绝。默认值为 0,含义是不排队。

  • queue_timeout:可选,查询在排队队列中的超时时间,单位为毫秒,如果查询在队列中的排队时间超过这个值,那么就会直接抛出异常给客户端。默认值为 0,含义是不排队。

  • scan_thread_num:可选,当前 workload group 用于 scan 的线程个数,默认值为 -1,含义是不生效,此时以 be 配置中的 scan 线程数为准。取值为大于 0 的整数。

  • max_remote_scan_thread_num:可选,读外部数据源的scan线程池的最大线程数,默认值为-1,当该值为-1时,实际的线程数由BE自行决定,通常和核数相关。

  • min_remote_scan_thread_num:可选,读外部数据源的scan线程池的最小线程数,默认值为-1,当该值为-1时,实际的线程数由BE自行决定,通常和核数相关。

  • tag:可选,默认为空,为Workload Group指定标签,相同标签的Workload Group资源累加值不能超过100%,如果期望指定多个值,可以使用英文逗号分隔,关于打标功能下文会有详细描述。

  • read_bytes_per_second:可选,含义为读Doris内表时的最大IO吞吐,默认值为-1,也就是不限制IO带宽。需要注意的是这个值并不绑定磁盘,而是绑定文件夹。
    比如为Doris配置了2个文件夹用于存放内表数据,那么每个文件夹的最大读IO不会超过该值,如果这2个文件夹都配置到同一块盘上,最大吞吐控制就会变成2倍的read_bytes_per_second。落盘的文件目录也受该值的约束。

  • remote_read_bytes_per_second:可选,含义为读Doris外表时的最大IO吞吐,默认值为-1,也就是不限制IO带宽。

注意事项:

  1. 目前暂不支持 CPU 的软限和硬限的同时使用,一个集群某一时刻只能是软限或者硬限,下文中会描述切换方法。

  2. 所有属性均为可选,但是在创建 Workload Group 时需要指定至少一个属性。

  3. 需要注意 cgroup v1 和cgroup v2 版本 cpu 软限默认值是有区别的, cgroup v1 的 cpu 软限默认值为1024,取值范围为2到262144。而 cgroup v2 的 cpu 软限默认值为100,取值范围是1到10000。
    如果软限填了一个超出范围的值,这会导致 cpu 软限在BE修改失败。还有就是在cgroup v1的环境上如果按照cgroup v2的默认值100设置,这可能导致这个workload group的优先级在该机器上是最低的。