From 71db59b005d47994bca7769b513187cb3dec0743 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:35:48 -0500 Subject: [PATCH] perf(agent): read CPUPercent only on top-10 RAM processes, not all Filter by RAM first (cheap), then call CPUPercent on just the 10 winners. Reduces /proc reads from hundreds to 10 per interval. Co-Authored-By: Claude Sonnet 4.6 --- agent/main.go | 9 +++++---- resources/views/servidor_dashboard.html | 8 ++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/agent/main.go b/agent/main.go index df5a8f7..6ccf5d5 100644 --- a/agent/main.go +++ b/agent/main.go @@ -245,10 +245,10 @@ func collectMetrics() (*Metricas, error) { m.TCPConns = len(conns) } - // Top 10 procesos por RAM (CPUPercent por proceso es muy costoso en sistemas con muchos contenedores) + // Top 10 procesos: filtrar por RAM primero (barato), luego leer CPU solo en esos 10 if procs, err := process.Processes(); err == nil { type pd struct { - pid int32 + proc *process.Process name string ramMB float64 } @@ -265,7 +265,7 @@ func collectMetrics() (*Metricas, error) { if ramMB < 1 { continue } - lista = append(lista, pd{p.Pid, name, ramMB}) + lista = append(lista, pd{p, name, ramMB}) } sort.Slice(lista, func(i, j int) bool { return lista[i].ramMB > lista[j].ramMB @@ -275,7 +275,8 @@ func collectMetrics() (*Metricas, error) { limit = len(lista) } for _, d := range lista[:limit] { - m.TopProcs = append(m.TopProcs, ProcesoInfo{d.pid, d.name, 0, d.ramMB}) + cpuPct, _ := d.proc.CPUPercent() // solo 10 lecturas, no cientos + m.TopProcs = append(m.TopProcs, ProcesoInfo{d.proc.Pid, d.name, round2(cpuPct), d.ramMB}) } } diff --git a/resources/views/servidor_dashboard.html b/resources/views/servidor_dashboard.html index a1deb35..fbd8b66 100644 --- a/resources/views/servidor_dashboard.html +++ b/resources/views/servidor_dashboard.html @@ -162,13 +162,17 @@ +
ProcesoCPU% RAM