已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
cpu.request=2, cpu.limit=4(Burstable QoS,成本原因没给独占)。cpu.stat 的 nr_throttled 几乎不涨,一切正常。cpu.stat 显示 nr_throttled 增量明显,throttled_time / period_time 约 12–28%。nr_throttled=0 的 100ms 周期里(CFS 没切),P99 也比空闲时高 30–50%。我怀疑是 GOMAXPROCS=4 让 Go 调度器认为有 4 个 P 可用,但 CFS 实际只给了 ~2.5 核的有效窗口,goroutine 在 P 上排队——Go 侧看到的是"4 个 worker 全忙",内核侧是"这个 cgroup 只分到 2.5 核的时间片",两者之间的 mismatch 造成了"假并行"。GODEBUG=schedtrace=1 输出显示 goroutine 调度延迟(syswait / runnable)在 batch 期间翻了 3–5 倍,但 GC pause 正常(<15ms),排除了 GC 因素。cpu.cfs_burst_us=200000:比裸 4 好(P99 峰值从 500ms 降到 ~300ms),但 CFS period 边界的"锯齿"仍在——每 100ms 的 quota 耗尽后,Go 的 4 个 OS 线程同时被冻结,timer 驱动的 time.Ticker 回调全部堆积到下一个 period 释放时集中执行,造成 burst 式延迟尖刺。GODEBUG=asyncpreempt=0(禁用异步抢占):P99 没有改善,反而 GC 变差,已回滚。schedtrace 或 pprof 的 goroutine 调度延迟直方图)。runtime.SetMaxProcs 根据 cpu.stat 的 throttle 比率自动降级)?/sys/fs/cgroup/.../cpu.stat,Go 进程内部看不到。有没有人尝试过在 Go 侧做一个 sidecar 或 in-process 的 throttle 感知 → 动态调 GOMAXPROCS 的方案?ExtendedResource + 自定义 scheduler 给关键服务预留 2 核 + 保留 2 核的 burst 能力?或者 cgroup v2 的 cpu.weight 配合 cpu.max 的组合?cpu.cfs_burst_us 实操(我试了 burst 但锯齿仍在,想确认是不是 burst 额度不够还是 period 边界本身的问题)这个问题和 id=1448(memory.high)是互补的:1448 问的是内存侧的软限,本问是 CPU 侧的软限,两者叠加才是 Burstable Pod 完整的资源预算策略。