Workload Group效果不预期,没能做到资源隔断

Viewed 73

目前生产使用doris最大的顾虑就是可能存在不预期的大批量大sql会对集群资源造成很大的冲击,导致整个集群不可用
再了解workload group资源隔离特性后并且等待迭代的多个版本后再生产对该特性进行了施工
生产的doris版本是V2.1.7,并且是CGroup V1版本前置目录和be的配置都已经做好了配置
然后新增了两个组,分别是a_group,b_group并且将主要的查询也用户a_user和b_user挂载并默认配置组,施工执行语句如下

CREATE WORKLOAD GROUP IF NOT EXISTS a_group
PROPERTIES(
    "memory_limit"="30%",
    "cpu_share"="157286",
    "cpu_hard_limit"="40%",
    "enable_memory_overcommit"="false"
);
GRANT USAGE_PRIV ON WORKLOAD GROUP 'a_group' TO 'a_user'@'%';
set property for 'a_user' 'default_workload_group' = 'a_group';

因为主要的两个用户独立出去了,所以把默认的normal组也做了调整并开启硬隔离

alter workload group normal properties('cpu_hard_limit'='10%','enable_memory_overcommit'='false','memory_limit'='10%');

ADMIN SET FRONTEND CONFIG ("enable_cpu_hard_limit" = "true");

这么配置后,总体的workload group的memory limit是 50%,所有的workload groupd enbale_meory_overcommit都是false,总的cpu_hard_limit是60%
我理解这么配置后,不管怎么样,集群都不会崩,因为左右最大资源的冗余了很大
但是实际情况是,cpu和内存还是照样被打满,与我原来的预期差很多
是我配置的问题?还是对这个特性的理解不对?
image.pngimage.png

3 Answers

审计日志中,确实有部分sql被cancelled了,但是集群也确确实实的挂了,跟既有的隔离配置阈值相违背了
image.png

1 show workload group命令看下目前所有wg的cpu硬限配置,这边只列了normal和group_a的。
2 如果配置了硬限但是cpu还是吃满,有两种可能一种是,配置没生效,可以看下https://doris.apache.org/zh-CN/docs/admin-manual/workload-management/workload-group#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 文档确认cgroup环境配置是否生效。
还有一种可能是,当时有其他组件占用cpu比较高,比如Compaction,这个可以通过top -H -p 命令确认下

3 【不管怎么样,集群都不会崩,因为左右最大资源的冗余了很大】,进程内隔离做不到你说的这种,因为进程内无法做到很彻底的隔离,难免会有共享的代码逻辑和公共组件。

#!/bin/bash

# 输入参数:进程名称
if [ -z "$1" ]; then
    echo "请提供进程名称作为参数"
    exit 1
fi

if [ -z "$2" ]; then
    echo "请提供CPU触发阈值参数"
    exit 1
fi

if [ -z "$3" ]; then
    echo "请提供检查检查时间间隔参数,单位为秒"
    exit 1
fi

PROCESS_NAME=$1
CPU_THRESHOLD=$2
INTERVAL_TIME=$3

while true; do
    # 获取进程的 PID
    PID=$(pgrep -f "$PROCESS_NAME" | awk 'NR == 1')

    if [ -z "$PID" ]; then
        echo "未找到进程: $PROCESS_NAME"
        exit 1
    fi

    # 获取系统总的 CPU 使用率
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')

    if (( $(echo "$CPU_USAGE >= $CPU_THRESHOLD" | bc -l) )); then
        date '+%Y-%m-%d %H:%M:%S'
        echo "正在监控进程:$PROCESS_NAME (PID: $PID)"
        echo "CPU 使用率达到 ${CPU_USAGE}%,超过${CPU_THRESHOLD}%,开始计算线程的 CPU 使用率"
        top -b -n 1 -H -p $PID | awk '
                NR>7 {if ($9 != 0) cpu[$12]+=$9}  # 跳过前7行概览信息,仅处理CPU使用率不为0的线程
                END {
                    for (name in cpu) {
                        print cpu[name], name  # 输出每个线程名及其对应的CPU利用率
                    }
            }' | sort -k1,1nr
        echo
    fi

    sleep $INTERVAL_TIME
done