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 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-25 10:35:48 -05:00
co-authored by Claude Sonnet 4.6
parent ad531c6dfc
commit 71db59b005
2 changed files with 11 additions and 6 deletions
+5 -4
View File
@@ -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})
}
}