Moniteur : un seul nvidia-smi pour tous les onglets, aucun pour un onglet caché

Chaque onglet ouvert (et chaque téléphone) interrogeait /api/vram toutes les
3 s, et chaque requête lançait son propre nvidia-smi — y compris depuis un
onglet en arrière-plan que personne ne regarde, pendant que llama-server
génère. Rien de tout cela ne touche au modèle : seules les jauges sont
concernées.

- gpuStatsCached : lecture partagée de 2 s, verrou tenu pendant la requête
  pour que des appels simultanés attendent la même lecture. nvidia-smi
  introuvable (Mac, CPU seul) mémorisé une minute ; une autre erreur se
  retente au délai normal.
- Seul handleVram passe par le cache. Le déchargement (lecture « avant » et
  gpuSettle) garde des lectures fraîches : deux valeurs égales servies par
  le cache feraient conclure gpuSettle à tort. Le cache est vidé après un
  déchargement.
- UI : statut, VRAM et RAM ne sont plus interrogés dans un onglet caché ;
  lecture immédiate au retour.
- Tests : cache (réutilisation, erreur, binaire absent, appels simultanés)
  et échantillonneur du déchargement qui contourne le cache.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 01:57:55 +02:00
1 parent 3dff7e0e04
commit 4f34694400
5 files changed
+214 -19

No files matched your search

+11 -3
View File
@@ -770,6 +770,14 @@ async function send(){
fail('échec de l\'envoi — réessaie');
}
loadAll();
setInterval(loadStatus, 5000);
setInterval(loadVram, 3000);
setInterval(loadRam, 3000);
// Jauges et pastille d'état : rien à rafraîchir dans un onglet que personne ne
// regarde. Chaque tic lançait sinon un nvidia-smi côté serveur, pour chaque
// onglet ou téléphone laissé ouvert, pendant que le modèle génère. Au retour de
// l'onglet, une lecture immédiate remet tout à jour.
const pollVisible=(fn)=>()=>{ if(!document.hidden) fn(); };
setInterval(pollVisible(loadStatus), 5000);
setInterval(pollVisible(loadVram), 3000);
setInterval(pollVisible(loadRam), 3000);
document.addEventListener('visibilitychange', ()=>{
if(!document.hidden){ loadStatus(); loadVram(); loadRam(); }
});