fix: CPU real por proceso en el monitor, y UTXO Map usando la caché
La columna %CPU de ps aux es la media desde que arrancó el proceso, no el consumo actual: un proceso que trabajó mucho hace días seguía apareciendo alto para siempre. Se detectó porque los porcentajes no cambiaban nunca entre lecturas mientras la CPU global sí variaba. Ahora se mide con dos lecturas de /proc/PID/stat separadas 500 ms, el mismo método que ya usaba getCpuUsage para el total. La UI muestra el % sobre el total de la máquina, con el % por núcleo y la media de ps en el tooltip. Verificado con carga artificial: 100% de un núcleo (25% de 4) frente al 152% que reportaba ps, imposible para un proceso de un solo hilo. Además, el UTXO Map era el único punto que se saltaba la caché usando fetchWithTimeout directo. Ahora pasa por get().
This commit is contained in:
+18
-5
@@ -2837,11 +2837,22 @@
|
||||
<div key={i} style={{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"5px 0",borderBottom:i<4?`1px solid ${C.border}`:"none"}}>
|
||||
<span style={{fontSize:"0.7rem",fontFamily:"monospace",color:C.blue,width:120,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}>{p.command}</span>
|
||||
<div style={{display:"flex",gap:8}}>
|
||||
<Badge color={C.amber}>CPU {p.cpu}%</Badge>
|
||||
{/* Se muestra el % del sistema (lo que de verdad se
|
||||
quiere saber: cuánto de la máquina se lleva). El
|
||||
% de un núcleo va en el tooltip, para comparar con
|
||||
top si hace falta. */}
|
||||
<Badge color={p.cpuSistema>25?C.red:p.cpuSistema>10?C.amber:C.t2}>
|
||||
<span title={p.cpu!=null?`${p.cpu}% de un núcleo · media desde que arrancó según ps: ${p.cpuMedia}%`:""}>
|
||||
CPU {p.cpuSistema!=null?p.cpuSistema:p.cpu}%
|
||||
</span>
|
||||
</Badge>
|
||||
<Badge color={p.mem>30?C.red:p.mem>15?C.amber:C.t2}>RAM {p.mem}%</Badge>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
<div style={{fontSize:"0.55rem",color:C.t3,fontFamily:"monospace",marginTop:8,lineHeight:1.5}}>
|
||||
CPU sobre el total de la máquina ({sysData.cpu?.count||"?"} núcleos), medida en una ventana de 500 ms — no es la media desde el arranque que muestra <code>ps</code>, que engaña porque un proceso que trabajó mucho hace días sigue apareciendo alto.
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -3571,13 +3582,15 @@
|
||||
if(sorted.length>MAX_UTXOS) setErr(`Mostrando ${MAX_UTXOS} de ${sorted.length} UTXOs — se muestran los de mayor valor.`);
|
||||
|
||||
// Cargar txs de origen para contexto (máx 10, las más grandes)
|
||||
// Vía get() y no fetch directo: así pasa por la caché compartida.
|
||||
// Las transacciones confirmadas son inmutables y se guardan toda la
|
||||
// sesión, de modo que volver a este UTXO Map (o analizar una de estas
|
||||
// txs en otra pestaña) no cuesta ni una petición más al nodo.
|
||||
const cache={};
|
||||
const toFetch=limited.slice(0,10);
|
||||
await Promise.all(toFetch.map(async u=>{
|
||||
try{
|
||||
const res=await fetchWithTimeout(`${base}/api/tx/${u.txid}`);
|
||||
if(res.ok) cache[u.txid]=await res.json();
|
||||
}catch{}
|
||||
const t = await get(`/api/tx/${u.txid}`, null);
|
||||
if (t) cache[u.txid] = t;
|
||||
}));
|
||||
|
||||
setTxCache(cache);
|
||||
|
||||
Reference in New Issue
Block a user