perf(agent): sort top procs by RAM only, skip per-process CPUPercent
CPUPercent() on every process reads /proc/<pid>/stat for all processes, causing ~19% CPU spike on servers with many containers. Sorting by RAM is a single /proc read per process and much cheaper. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
42dc7020fc
commit
ad531c6dfc
+6
-8
@@ -245,17 +245,15 @@ func collectMetrics() (*Metricas, error) {
|
||||
m.TCPConns = len(conns)
|
||||
}
|
||||
|
||||
// Top 10 procesos por CPU (luego por RAM como desempate)
|
||||
// Top 10 procesos por RAM (CPUPercent por proceso es muy costoso en sistemas con muchos contenedores)
|
||||
if procs, err := process.Processes(); err == nil {
|
||||
type pd struct {
|
||||
pid int32
|
||||
name string
|
||||
cpu float64
|
||||
ramMB float64
|
||||
}
|
||||
var lista []pd
|
||||
for _, p := range procs {
|
||||
cpuPct, _ := p.CPUPercent()
|
||||
name, _ := p.Name()
|
||||
if name == "" {
|
||||
continue
|
||||
@@ -264,12 +262,12 @@ func collectMetrics() (*Metricas, error) {
|
||||
if mi, err := p.MemoryInfo(); err == nil && mi != nil {
|
||||
ramMB = round2(float64(mi.RSS) / (1024 * 1024))
|
||||
}
|
||||
lista = append(lista, pd{p.Pid, name, round2(cpuPct), ramMB})
|
||||
if ramMB < 1 {
|
||||
continue
|
||||
}
|
||||
lista = append(lista, pd{p.Pid, name, ramMB})
|
||||
}
|
||||
sort.Slice(lista, func(i, j int) bool {
|
||||
if lista[i].cpu != lista[j].cpu {
|
||||
return lista[i].cpu > lista[j].cpu
|
||||
}
|
||||
return lista[i].ramMB > lista[j].ramMB
|
||||
})
|
||||
limit := 10
|
||||
@@ -277,7 +275,7 @@ func collectMetrics() (*Metricas, error) {
|
||||
limit = len(lista)
|
||||
}
|
||||
for _, d := range lista[:limit] {
|
||||
m.TopProcs = append(m.TopProcs, ProcesoInfo{d.pid, d.name, d.cpu, d.ramMB})
|
||||
m.TopProcs = append(m.TopProcs, ProcesoInfo{d.pid, d.name, 0, d.ramMB})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user