7.4 KiB
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
- ✅ Scripts correctifs appliqués
- ✅ Backend redémarré
- ⏳ Relancer le benchmark sur aorus (action requise)
- ⏳ Vérifier que toutes les données s'affichent
- ⏳ 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
Benchmarkrecords
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