使用 Workload Group 设置cpu硬限制无效

Viewed 223

版本: 2.1.7-rc01
自定义Workload Group 并设置了 cpu_hard_limit。也按官方文档检查了cgroup的版本没有问题

1.fe配置了experimental_enable_cpu_hard_limit=true 并重启了fe。

2.设置执行完毕: ADMIN SET FRONTEND CONFIG ("enable_cpu_hard_limit" = "true");

image.png

新增doris_log_user用户,并授权我定义好的Workload Group:log_workload_group,并且取消了对应默认normal的分组:
image.png

这里我设置的cpu上线30%,然后我用doris_log_user 登录webui查询,发现限制并没有生效:cpu能用到将近100%。。
image.png

尝试查询带上 set workload_group = 'log_workload_group';依然无效

查看fe.audit.log 日志,走了默认的normal workload group。但前提是我已经将用户的normal授权移除了,只有我自定义的log_workload_group才对!
image.png

PS: 通过 set property 'default_workload_group' = 'log_workload_group';
成功设置用户默认的default_workload_group,然后再次发起查询后,查看audit日志,也使用了log_workload_group策略,但cpu依然拉满
image.png
image.png

top信息:

关闭steamload导入,只查询测试:单节点cpu还是会跑到90%

image.png

查询资源使用:(cpu还能用到100?)
select * from workload_group_resource_usage where WORKLOAD_GROUP_ID=192247

6 Answers

1 确认cgroup在be上是否配置成功,方法如下:
文件“/sys/fs/cgroup/cpu/doris/query/<workload group的id>/cpu.cfs_quota_us”的值不为-1
文件“/sys/fs/cgroup/cpu/doris/query/<workload group的id>/tasks”的内存是doris进程的线程号

2 如果配置成功但还是无效,可以使用“top -H -p 进程id”命令确认两点:
1 活跃的线程是否是预期使用了配置的硬限的线程
2 活跃的线程是否有compaction等其他线程

1.cpu.cfs_quota_us 不为-1.确实是我cpu30%限制数值
2.tasks 里没有doris 的进程号,是其他的task pid,这里还需要怎么分析呢
更新:
1 “[topic_publish_wg]update workload group finish”, 去be.INFO根据这个关键字找下日志,贴下,最好是包含192247的这个group的,这个会打印每个workload group的更新情况:

2.另外be.INFO日志里最好还能找到“add thread to 192247”的字样;
image.png

1 “[topic_publish_wg]update workload group finish”, 去be.INFO根据这个关键字找下日志,贴下,最好是包含192247的这个group的,这个会打印每个workload group的更新情况。
2 找个cpu用满的的机器,在用满的时候top -H -p 进程号,我手工计算下cpu的使用。
3 另外be.INFO日志里最好还能找到“add thread to 192247”的字样
如果cgroup的配置是更新成功的
如果cgroup配置更新成功,查询用的也是这个group,但是还是超了,那说明cgroup本身出了问题,比如你用的是容器而不是物理机?

日志看着cgroup更新是正常的,但是如果top -H -p 看到的线程在task里找不到的话,我有点怀疑是拿线程id的函数不太对,你可以在be所在机器上跑下下边这个C++的程序,验证下通过函数拿到的线程id和top看到的是否一致,如果不一致就说明这个函数在你的机器上拿到的线程id不太对

我这边测试效果是这样的,C++脚本的输出

Main Thread ID (TID) using syscall(SYS_gettid): 3659502
Thread ID (TID) using syscall(SYS_gettid): 3659503

top命令的输出
image.png

线程内打印和top命令看到的是一样的

编译命令:g++ tid.cpp -pthread

#include <iostream>
#include <unistd.h>  // for syscall, sleep function
#include <sys/syscall.h>  // for SYS_gettid
#include <pthread.h>  // for thread operations

void* thread_function(void*) {
    // 使用 syscall(SYS_gettid) 获取线程ID
    pid_t tid = syscall(SYS_gettid);
    std::cout << "Thread ID (TID) using syscall(SYS_gettid): " << tid << std::endl;

    std::cout << "Thread is sleeping for 1 minute..." << std::endl;
    sleep(600);  // Sleep for 60 seconds

    std::cout << "Thread has finished sleeping." << std::endl;
    return NULL;
}

int main() {
    // 获取主线程的TID
    pid_t main_tid = syscall(SYS_gettid);
    std::cout << "Main Thread ID (TID) using syscall(SYS_gettid): " << main_tid << std::endl;

    // 创建一个新线程
    pthread_t thread;
    pthread_create(&thread, NULL, thread_function, NULL);

    // 等待新线程结束
    pthread_join(thread, NULL);

    return 0;
}