Files
serv_benchmark/docs/CORRECTIFS_FINAUX_2025-12-14.md
Gilles Soulier c67befc549 addon
2026-01-05 16:08:01 +01:00

7.4 KiB
Executable File

Correctifs Finaux - 14 décembre 2025, 03:00

🔧 Problèmes Résolus

Problème #1: CPU Cores = 0 dans le Payload JSON

Symptôme : Le benchmark affichait ✓ Cores: 24%, Threads: 24 et le payload JSON contenait "cores": 0.

Cause : Le parsing de lscpu capturait des caractères non-numériques (ex: % de "CPU scaling MHz: 118%").

Solution : Ajout de gsub(/[^0-9]/,"",$2) pour ne garder que les chiffres.

Fichier modifié : scripts/bench.sh:243-250

# AVANT
cores_per_socket=$(lscpu | awk -F: '/Core\(s\) per socket/ {gsub(/^[ \t]+/,"",$2); print $2}')
sockets=$(lscpu | awk -F: '/Socket\(s\)/ {gsub(/^[ \t]+/,"",$2); print $2}')
cores=$((${cores_per_socket:-1} * ${sockets:-1}))

# APRÈS
cores_per_socket=$(lscpu | awk -F: '/Core\(s\) per socket/ {gsub(/^[ \t]+/,"",$2); gsub(/[^0-9]/,"",$2); print $2}')
sockets=$(lscpu | awk -F: '/Socket\(s\)/ {gsub(/^[ \t]+/,"",$2); gsub(/[^0-9]/,"",$2); print $2}')

# S'assurer que les valeurs sont des nombres valides
[[ -z "$cores_per_socket" || "$cores_per_socket" == "0" ]] && cores_per_socket=1
[[ -z "$sockets" || "$sockets" == "0" ]] && sockets=1

cores=$((cores_per_socket * sockets))

Résultat attendu :

  • Ryzen 9 5900X : cores = 12 (au lieu de 0)
  • Intel i5-2400 : cores = 2 (au lieu de 0)

Problème #2: Backend ne met pas à jour le Hardware Snapshot

Symptôme : Les données du benchmark étaient envoyées (HTTP 200) mais ne s'affichaient pas dans le frontend. Les champs ram_used_mb, ram_free_mb, bios_version restaient null ou anciens.

Cause : Le backend créait TOUJOURS un nouveau HardwareSnapshot au lieu de mettre à jour le snapshot existant du device.

Code problématique (benchmark.py:54) :

snapshot = HardwareSnapshot(  # Toujours nouveau!
    device_id=device.id,
    captured_at=datetime.utcnow(),
    # ... tous les champs
)
db.add(snapshot)

Solution : Récupérer le snapshot existant et le mettre à jour.

Fichier modifié : backend/app/api/benchmark.py:52-132

# 2. Get or create hardware snapshot
hw = payload.hardware

# Check if we have an existing snapshot for this device
existing_snapshot = db.query(HardwareSnapshot).filter(
    HardwareSnapshot.device_id == device.id
).order_by(HardwareSnapshot.captured_at.desc()).first()

# If we have an existing snapshot, update it instead of creating a new one
if existing_snapshot:
    snapshot = existing_snapshot
    snapshot.captured_at = datetime.utcnow()  # Update timestamp
else:
    # Create new snapshot if none exists
    snapshot = HardwareSnapshot(
        device_id=device.id,
        captured_at=datetime.utcnow()
    )

# Update all fields (whether new or existing snapshot)
snapshot.cpu_cores = hw.cpu.cores if hw.cpu else None
snapshot.ram_used_mb = hw.ram.used_mb if hw.ram else None
snapshot.ram_free_mb = hw.ram.free_mb if hw.ram else None
snapshot.bios_version = hw.motherboard.bios_version if hw.motherboard else None
# ... tous les autres champs

# Add to session only if it's a new snapshot
if not existing_snapshot:
    db.add(snapshot)

db.flush()

Comportement :

  • Premier benchmark : Crée un nouveau snapshot
  • Benchmarks suivants : Met à jour le snapshot existant avec les nouvelles données

Avantages :

  • RAM utilisée/libre toujours à jour
  • Température disques mise à jour
  • BIOS version conservée après le premier benchmark
  • Un seul snapshot par device (plus simple)

📊 Impact des Correctifs

Avant les Correctifs

Payload JSON envoyé :

{
  "hardware": {
    "cpu": {
      "cores": 0,   BUG
      "threads": 24
    },
    "ram": {
      "used_mb": 13478,
      "free_mb": 10864
    },
    "motherboard": {
      "bios_version": "F65e"
    }
  }
}

Base de données :

{
  "cpu_cores": 0,   Ancien
  "ram_used_mb": null,   Non mis à jour
  "ram_free_mb": null,   Non mis à jour
  "bios_version": null   Non mis à jour
}

Frontend :

Cores: ? (0 affiché comme N/A)
RAM Utilisée: N/A
BIOS: N/A

Après les Correctifs

Payload JSON envoyé :

{
  "hardware": {
    "cpu": {
      "cores": 12,   CORRIGÉ
      "threads": 24
    },
    "ram": {
      "used_mb": 13478,
      "free_mb": 10864
    },
    "motherboard": {
      "bios_version": "F65e"
    }
  }
}

Base de données :

{
  "cpu_cores": 12,   Mis à jour
  "ram_used_mb": 13478,   Mis à jour
  "ram_free_mb": 10864,   Mis à jour
  "bios_version": "F65e"   Mis à jour
}

Frontend :

Cores: 12
RAM Utilisée: 13 GB (28%)
BIOS: F65e

🧪 Tests à Effectuer

1. Relancer le Benchmark

cd /home/gilles/Documents/vscode/serv_benchmark
sudo bash scripts/bench.sh

Vérifications :

  • Console affiche Cores: 12, Threads: 24 (sans %)
  • Payload JSON contient "cores": 12
  • HTTP 200 OK

2. Vérifier les Données dans la DB

curl -s http://localhost:8007/api/devices/2 | jq '.last_hardware_snapshot | {
  cpu_cores,
  cpu_threads,
  ram_used_mb,
  ram_free_mb,
  bios_version,
  bios_date
}'

Résultat attendu :

{
  "cpu_cores": 12,
  "cpu_threads": 24,
  "ram_used_mb": 13478,
  "ram_free_mb": 10864,
  "bios_version": "F65e",
  "bios_date": "09/20/2023"
}

3. Vérifier le Frontend

http://localhost:8087/device_detail.html?id=2

Sections à vérifier :

  • Carte Mère : Gigabyte B450 AORUS ELITE + BIOS F65e
  • 🔲 CPU : 12 cores, 24 threads
  • 💾 RAM : 47 GB total, 13 GB utilisée (28%)
  • 💿 Stockage : 7 disques détectés
  • 🎮 GPU : NVIDIA GeForce RTX 3060
  • 🌐 Réseau : eno1 (10.0.1.109)
  • 📊 Benchmarks : Score global 145.82

📁 Fichiers Modifiés

Fichier Lignes Changement
scripts/bench.sh 243-250 Parsing robuste cores CPU + validation
backend/app/api/benchmark.py 52-132 Update snapshot existant au lieu de créer nouveau

🎯 Prochaines Étapes

  1. Scripts correctifs appliqués
  2. Backend redémarré
  3. Relancer le benchmark sur aorus (action requise)
  4. Vérifier que toutes les données s'affichent
  5. Tester sur d'autres devices si disponibles

📝 Notes Techniques

Pourquoi mettre à jour au lieu de créer ?

Avantages :

  • Un seul snapshot par device = requêtes plus rapides
  • RAM usage toujours à jour
  • Historique conservé dans les Benchmark records

Compromis :

  • Si le hardware change physiquement (nouveau CPU, nouvelle RAM), le snapshot sera écrasé
  • Pour un vrai historique hardware, il faudrait créer un nouveau snapshot seulement quand le hardware change significativement

Alternative Future

Implémenter une logique de détection de changement hardware :

def hardware_changed_significantly(old_snapshot, new_hardware):
    # Compare CPU, RAM total, GPU, nombre de disques
    return (
        old_snapshot.cpu_model != new_hardware.cpu.model or
        old_snapshot.ram_total_mb != new_hardware.ram.total_mb or
        old_snapshot.gpu_model != new_hardware.gpu.model
    )

Si hardware_changed_significantly() == True → Créer nouveau snapshot Sinon → Mettre à jour snapshot existant


Version : Frontend 2.0.2 / Backend 1.1.1 / Script 1.2.1 Date : 14 décembre 2025, 03:00 Status : Correctifs appliqués, prêt pour test