fix(nodes): 修正 Request 占用两处计算错误
AIOps CI / Backend (test, vet, build) (push) Canceled after 0s
AIOps CI / Agent (test, vet, build) (push) Canceled after 0s
AIOps CI / Frontend (typecheck, lint, build) (push) Canceled after 0s
AIOps CI / API integration (SQLite + redka) (push) Canceled after 0s

1. CPU 分母单位错误
   Allocatable["cpu"] 形如 "15890m",parseIntResource 用 %d 解析得 15890(已是毫核),
   再乘 1000 使分母放大 1000 倍,16 核节点显示 0.07% 而非 70%。
   改用 parseCpuToMilli 统一到毫核。

2. 已结束 Pod 未排除
   Succeeded/Failed 的 Pod 不再占用资源,其 Request 被计入导致
   分配率虚高(实测 172.19.0.61 显示 1090%,187 个 Pod 中多数已结束)。
   改为跳过非运行态 Pod。

修复后 12 个节点分配率回到 60~90%,无超过 100% 的异常值。

// Logan.Li
This commit is contained in:
Logan.Li committed 2026-10-18 21:09:48 +00:00
1 parent c69d5479b3
commit 286d7cd906
1 file changed
+10 -3
+10 -3
View File
@@ -71,6 +71,11 @@ func (h *KubernetesHandler) ListNodes(c *gin.Context) {
if p.Spec.NodeName == "" { if p.Spec.NodeName == "" {
continue continue
} }
// 只统计仍在消耗资源的 Pod:Succeeded/Failed 已结束,
// 把它们的 Request 计入会虚高分配率(曾出现 1090% 的异常值)。 // Logan.Li
if p.Status.Phase == "Succeeded" || p.Status.Phase == "Failed" {
continue
}
agg := podReqs[p.Spec.NodeName] agg := podReqs[p.Spec.NodeName]
if agg == nil { if agg == nil {
agg = &reqAgg{} agg = &reqAgg{}
@@ -137,15 +142,17 @@ func (h *KubernetesHandler) ListNodes(c *gin.Context) {
s.MemoryUsage = float64(memMi) / float64(memCapacity) * 100 s.MemoryUsage = float64(memMi) / float64(memCapacity) * 100
} }
} }
// Request 占用:本节点 Pod 已申请 / 可分配。 // Logan.Li // Request 占用:本节点 Pod 已申请 / 可分配。
// 注意 Allocatable 的 cpu 可能带 m 后缀(如 "15890m"),必须用 parseCpuToMilli 统一到毫核,
// 不能再用 parseIntResource 后乘 1000,否则分母会被放大 1000 倍。 // Logan.Li
if agg := podReqs[n.Metadata.Name]; agg != nil { if agg := podReqs[n.Metadata.Name]; agg != nil {
allocCPU := parseIntResource(n.Status.Allocatable["cpu"]) allocCPU := parseCpuToMilli(n.Status.Allocatable["cpu"])
allocMem := parseMemResource(n.Status.Allocatable["memory"]) allocMem := parseMemResource(n.Status.Allocatable["memory"])
s.PodCount = agg.pods s.PodCount = agg.pods
s.CPURequestM = agg.cpuM s.CPURequestM = agg.cpuM
s.MemRequestMi = agg.memMi s.MemRequestMi = agg.memMi
if allocCPU > 0 { if allocCPU > 0 {
s.CPUAllocPct = float64(agg.cpuM) / float64(allocCPU*1000) * 100 s.CPUAllocPct = float64(agg.cpuM) / float64(allocCPU) * 100
} }
if allocMem > 0 { if allocMem > 0 {
s.MemAllocPct = float64(agg.memMi) / float64(allocMem) * 100 s.MemAllocPct = float64(agg.memMi) / float64(allocMem) * 100