perf(loki): 查询并行度改为自动跟随 CPU 核数(不再硬编码)
=== 问题 ===
max_query_parallelism 原来是硬编码值,改过两轮(8 → 6):
- 8:4 核机器上 76% 调度周期被限流,label values 要 20 秒
- 6:仍然高于核数,25% 周期限流,查询并没有更快
根因不是"该填几",而是**并行度只有一个正确值:等于 CPU 核数**。
把它做成可配置项反而是坑 —— 用户改了 CPU 忘了改并行度就出现错配。
=== 做法 ===
新增 queryParallelism(resourcesCPU):
- 从部署记录的资源规格推导,模板渲染成 {{ .QueryParallelism }}
- 容错:支持 "4000m"/"500m" 毫核写法(向上取整)
- 边界:低于 2 核按 2,高于 12 核按 12(再高频只会互相抢 CPU)
- 非法值/空值回退 4
用户在「组件部署」里改 CPU,并行度自动跟随,页面上不需要新字段。
=== 实测(4 核 + 并行 4)===
by-app(15m) 11913ms 75 条序列 (并行 6 时 12438ms)
label/namespace 38ms
label/app 25ms
label/pod 25ms
限流 61/252 周期(仅重查询那几秒)
附带 TestQueryParallelism 覆盖 10 种输入(含毫核/越界/非法值)。
This commit is contained in:
1 parent
ad0d35f72a
commit
419a81c2af
2 files changed
+74
-10
No files matched your search
@@ -0,0 +1,31 @@
|
||||
package services
|
||||
|
||||
import "testing"
|
||||
|
||||
// 查询并行度必须跟部署的 CPU 核数对齐。
|
||||
//
|
||||
// 事故背景:曾经写死 8,而部署只有 4 核 → 多个子查询互相抢 CPU,
|
||||
// 实测 76% 的调度周期被限流,连 label values 都要 20 秒。
|
||||
// 现在改成从 resourcesCPU 推导,用户在界面改 CPU 时并行度自动跟随。
|
||||
func TestQueryParallelism(t *testing.T) {
|
||||
cases := []struct {
|
||||
cpu string
|
||||
want int
|
||||
}{
|
||||
{"4", 4},
|
||||
{"8", 8},
|
||||
{"2", 2},
|
||||
{"1", 2}, // 低于 2 核按 2 兜底
|
||||
{"16", 12}, // 上限 12
|
||||
{"", 4}, // 空值走默认
|
||||
{"abc", 4}, // 非法值走默认
|
||||
{"4000m", 4}, // 毫核写法
|
||||
{"500m", 2}, // 0.5 核 → 向上取整 1 → 不低于 2
|
||||
{"6000m", 6},
|
||||
}
|
||||
for _, c := range cases {
|
||||
if got := queryParallelism(c.cpu); got != c.want {
|
||||
t.Errorf("queryParallelism(%q) = %d, want %d", c.cpu, got, c.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user