基于审计日志的资源组配置
在 StarRocks 中,资源组 提供了一种有效的资源隔离机制,通过基于用户身份和查询类型等分类器分配 CPU、内存和并发限制。这一特性对于在多租户环境中实现高效的资源利用至关重要。
传统的资源组配置通常依赖于经验判断。通过分析审计日志表 starrocks_audit_db__.starrocks_audit_tbl__ 中的历史查询数据,管理员可以采用一种数据驱动的方法来调整资源组。关键指标如 CPU 时间、内存消耗和查询并发性提供了关于实际工作负载特征的客观见解。
这种方法有助于:
- 防止因资源争用导致的查询延迟
- 保护集群免于资源耗尽
- 提高整体稳定性和可预测性
本主题提供了基于从审计日志中观察到的工作负载模式推导出适当的资源组参数的分步教程。
备注
本教程基于使用 AuditLoader 插件的分析,该插件允许您在集群内直接使用 SQL 语句查询审计日志。有关安装插件的详细说明,请参见 AuditLoader。
CPU 资源分配
目标
确定每个用户的 CPU 消耗,并使用 cpu_weight 或 exclusive_cpu_cores 按比例分配 CPU 资源。
分析
以下 SQL 聚合了过去 30 天每个用户的总 CPU 时间 (cpuCostNs),将其转换为秒,并计算总 CPU 使用率的百分比。
SELECT
user,
SUM(cpuCostNs) / 1e9 AS total_cpu_seconds, -- 查询总 CPU 时间。
(
SUM(cpuCostNs) /
(
SELECT SUM(cpuCostNs)
FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE state IN ('EOF','OK')
AND timestamp >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
)
) * 100 AS cpu_usage_percentage -- 计算每个用户的总 CPU 使用率百分比。
FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE state IN ('EOF','OK') -- 仅包含已完成的查询。
AND timestamp >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) -- 查询过去 30 天的数据。
GROUP BY user
ORDER BY total_cpu_seconds DESC
LIMIT 20; -- 列出 CPU 资源消耗最多的前 20 个用户。
最佳实践
假设每个 BE 固定有一定数量的 CPU 核心(例如,64 核)。如果某个用户占用了总 CPU 时间的 16% (cpu_usage_percentage),那么分配大约 64 × 16% ≈ 11 核 是合理的。
您可以按如下方式配置资源组的 CPU 限制:
-
exclusive_cpu_cores:- 其值不得超过单个 BE 上的总核心数。
- 所有资源组的
exclusive_cpu_cores总和不得超过单个 BE 上的总核心数。
-
cpu_weight:- 仅适用于软隔离资源组。
- 确定在剩余核心上竞争查询之间的相对 CPU 份额。
- 并不直接映射到固定数量的 CPU 核心。
内存管理
目标
识别内存密集型用户,并定义适当的内存限制和熔断器。
分析
以下 SQL 计算了过去 30 天内每个用户单个查询的最大内存使用量 (memCostBytes)。
SELECT
user,
MAX(memCostBytes) / (1024 * 1024) AS max_mem_mb -- 每个查询的最大内存使用量(以 MB 为单位)。
FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE state IN ('EOF','OK') -- 仅包含已完成的查询。
AND timestamp >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) -- 查询过去 30 天的数据。
GROUP BY user
ORDER BY max_mem_mb DESC
LIMIT 20; -- 列出内存资源消耗最多的前 20 个用户。