# Améliorations du Script bench.sh

Date : 13 décembre 2025
Version script : 1.1.0 → 1.2.0

## 📋 Résumé

Ce document décrit les améliorations apportées au script de benchmark client [scripts/bench.sh](scripts/bench.sh) suite à l'analyse détaillée des données collectées.

## 🎯 Objectifs

Améliorer la collecte de données hardware selon les recommandations de l'[ANALYSE_DONNEES final.md](ANALYSE_DONNEES final.md) pour :
1. Obtenir des informations plus détaillées sur le matériel
2. Calculer des scores plus précis et représentatifs
3. Collecter des métriques supplémentaires (températures, SMART health)

## ✨ Améliorations Implémentées

### 1. Support GPU NVIDIA (nvidia-smi)

**Problème** : Le script détectait les GPU via `lspci` mais n'obtenait pas la VRAM ni la version du driver pour les cartes NVIDIA.

**Solution** :
- Ajout de la détection automatique de `nvidia-smi`
- Collecte de la VRAM (en MB)
- Collecte de la version du driver NVIDIA
- Amélioration du nom du modèle GPU

**Code ajouté** :
```bash
if echo "$gpu_line" | grep -qi 'nvidia'; then
    gpu_vendor="NVIDIA"
    if command -v nvidia-smi &>/dev/null; then
        nvidia_model=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1)
        nvidia_vram=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>/dev/null | head -1)
        nvidia_driver=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null | head -1)

        [[ -n "$nvidia_model" ]] && gpu_model="$nvidia_model"
        [[ -n "$nvidia_vram" ]] && gpu_vram="$nvidia_vram"
        [[ -n "$nvidia_driver" ]] && gpu_driver="$nvidia_driver"
    fi
fi
```

**Champs JSON ajoutés** :
```json
{
  "gpu": {
    "vendor": "NVIDIA",
    "model": "GeForce RTX 3070",
    "memory_dedicated_mb": 8192,
    "driver_version": "525.105.17"
  }
}
```

**Bénéfices** :
- ✅ VRAM précise pour les cartes NVIDIA
- ✅ Version du driver (utile pour debug)
- ✅ Nom exact du modèle GPU

---

### 2. Amélioration du Parsing des Caches CPU

**Problème** : Le cache L1 total n'était pas calculé correctement (seul L1d était pris en compte, pas L1i).

**Solution** :
- Ajout de la collecte séparée de L1d (cache de données) et L1i (cache d'instructions)
- Calcul du cache L1 total = L1d + L1i

**Code ajouté** :
```bash
# L1 cache = L1d + L1i
local cache_l1d cache_l1i
cache_l1d=$(lscpu | awk -F: '/L1d cache/ {gsub(/[^0-9]/,"",$2); print $2}')
cache_l1i=$(lscpu | awk -F: '/L1i cache/ {gsub(/[^0-9]/,"",$2); print $2}')
cache_l1_kb=$((${cache_l1d:-0} + ${cache_l1i:-0}))
```

**Exemple** :
- Avant : L1 = 128 KB (seulement L1d)
- Après : L1 = 256 KB (L1d 128 KB + L1i 128 KB)

**Bénéfices** :
- ✅ Valeur correcte du cache L1 total
- ✅ Meilleure comparaison entre CPUs

---

### 3. Collecte des Températures et Santé SMART des Disques

**Problème** : Les informations SMART (température, health status) n'étaient pas collectées.

**Solution** :
- Ajout de la collecte de la température via `smartctl -A`
- Ajout du statut SMART health via `smartctl -H`
- Affichage de la température dans les logs

**Code ajouté** :
```bash
# Essayer de récupérer la température et le statut SMART
local smart_all
smart_all=$(sudo smartctl -A "/dev/$d" 2>/dev/null || true)

# Température (diverses variantes selon le type de disque)
temperature=$(echo "$smart_all" | awk '/Temperature_Celsius|Airflow_Temperature_Cel|Current Drive Temperature/ {print $10}' | head -1)
[[ -z "$temperature" ]] && temperature="null"

# Statut SMART health
local health
health=$(sudo smartctl -H "/dev/$d" 2>/dev/null | awk '/SMART overall-health|SMART Health Status/ {print $NF}' | head -1)
[[ -n "$health" ]] && smart_health="$health" || smart_health="null"
```

**Champs JSON ajoutés** :
```json
{
  "storage": [
    {
      "device": "sda",
      "model": "KINGSTON SA400S37480G",
      "size_gb": "480",
      "type": "ssd",
      "interface": "sata",
      "serial": "50026B77833E25E3",
      "temperature_c": 35,
      "smart_health": "PASSED"
    }
  ]
}
```

**Affichage amélioré** :
```
✓ Disque: /dev/sda - KINGSTON SA400S37480G (447.1G, ssd, 35°C)
```

**Bénéfices** :
- ✅ Surveillance de la température des disques
- ✅ Détection précoce des problèmes (SMART health)
- ✅ Meilleure visibilité sur l'état du stockage

---

### 4. Correction des Pondérations du Score Global

**Problème** : Les pondérations du score global ne correspondaient pas aux recommandations de l'analyse.

**Pondérations précédentes** :
- CPU : 40%
- RAM : 30%
- Disque : 30%
- Réseau : **non pris en compte**
- GPU : **non pris en compte**

**Pondérations corrigées** (selon analyse) :
- CPU : **30%**
- RAM : **20%**
- Disque : **25%**
- Réseau : **15%** ✨ *nouveau*
- GPU : **10%** ✨ *nouveau*

**Code modifié** :
```bash
# Score global selon pondérations recommandées :
# CPU 30%, RAM 20%, Disque 25%, Réseau 15%, GPU 10%
local scores="" total_weight=0

if [[ "$cpu_bench" != "null" ]]; then
    cs=$(echo "$cpu_bench" | jq '.score // 0')
    scores="$scores + $cs * 0.30"
    total_weight=$(safe_bc "$total_weight + 0.30")
fi

if [[ "$mem_bench" != "null" ]]; then
    ms=$(echo "$mem_bench" | jq '.score // 0')
    scores="$scores + $ms * 0.20"
    total_weight=$(safe_bc "$total_weight + 0.20")
fi

if [[ "$disk_bench" != "null" ]]; then
    ds=$(echo "$disk_bench" | jq '.score // 0')
    scores="$scores + $ds * 0.25"
    total_weight=$(safe_bc "$total_weight + 0.25")
fi

if [[ "$net_bench" != "null" ]]; then
    ns=$(echo "$net_bench" | jq '.score // 0')
    scores="$scores + $ns * 0.15"
    total_weight=$(safe_bc "$total_weight + 0.15")
fi

if [[ "$gpu_bench" != "null" ]]; then
    gs=$(echo "$gpu_bench" | jq '.score // 0')
    scores="$scores + $gs * 0.10"
    total_weight=$(safe_bc "$total_weight + 0.10")
fi
```

**Bénéfices** :
- ✅ Score global plus équilibré
- ✅ Prise en compte du réseau (important pour serveurs)
- ✅ Support futur du benchmark GPU
- ✅ Calcul normalisé même si certains benchmarks échouent

---

## 📊 Impact sur les Données Collectées

### Avant les améliorations

```json
{
  "cpu": {
    "cache_l1_kb": 128
  },
  "gpu": {
    "vendor": "NVIDIA",
    "model": "NVIDIA Corporation GP104 [GeForce GTX 1070]",
    "memory_dedicated_mb": null,
    "driver_version": null
  },
  "storage": [
    {
      "device": "sda",
      "temperature_c": null,
      "smart_health": null
    }
  ],
  "results": {
    "global_score": 45.2  // CPU 40% + RAM 30% + Disk 30%
  }
}
```

### Après les améliorations

```json
{
  "cpu": {
    "cache_l1_kb": 256  // ✨ L1d + L1i
  },
  "gpu": {
    "vendor": "NVIDIA",
    "model": "GeForce GTX 1070",  // ✨ Nom exact
    "memory_dedicated_mb": 8192,  // ✨ VRAM
    "driver_version": "525.105.17"  // ✨ Driver
  },
  "storage": [
    {
      "device": "sda",
      "temperature_c": 35,  // ✨ Température
      "smart_health": "PASSED"  // ✨ Santé
    }
  ],
  "results": {
    "global_score": 42.8  // ✨ CPU 30% + RAM 20% + Disk 25% + Net 15% + GPU 10%
  }
}
```

---

## 🧪 Tests Recommandés

### Test 1 : Machine avec GPU NVIDIA
```bash
# Vérifier que nvidia-smi est bien détecté
sudo bash scripts/bench.sh
# → Devrait afficher : GPU: GeForce RTX 3070 (8192MB VRAM)
```

### Test 2 : Températures des disques
```bash
# Vérifier que smartctl retourne bien les températures
sudo smartctl -A /dev/sda | grep Temperature
# → Si température présente, elle devrait apparaître dans le log bench.sh
```

### Test 3 : Score global avec réseau
```bash
# S'assurer qu'un serveur iperf3 est accessible
iperf3 -c 10.0.0.50 -t 5
# → Le score global doit inclure le score réseau (15%)
```

### Test 4 : Cache L1 CPU
```bash
# Vérifier que L1d + L1i sont bien additionnés
lscpu | grep 'L1'
# L1d cache: 128 KiB
# L1i cache: 128 KiB
# → bench.sh doit afficher cache_l1_kb: 256
```

---

## 📝 Compatibilité

### Systèmes supportés
- ✅ Debian/Ubuntu (testé)
- ✅ Systèmes avec `lscpu`, `smartctl`, `lspci`
- ✅ Machines avec ou sans GPU NVIDIA
- ✅ Machines avec ou sans `nvidia-smi`

### Dégradation gracieuse
- Si `nvidia-smi` absent → Utilise `lspci` uniquement
- Si `smartctl` absent → Pas de température/health
- Si iperf3 échoue → Score global calculé sans réseau
- Si dmidecode manquant → Infos basiques uniquement

---

## 🔄 Prochaines Étapes

### Améliorations futures possibles (Phase 2)
1. **Benchmark GPU** : Implémenter `glmark2` pour GPU score
2. **Température CPU** : Ajouter `sensors` pour température processeur
3. **Support AMD GPU** : Ajouter support `rocm-smi` pour cartes AMD
4. **BIOS/UEFI version** : Améliorer collecte via `dmidecode -t 0`
5. **PCIe gen** : Détecter version PCIe (2.0, 3.0, 4.0, 5.0)

---

## 📚 Références

- [ANALYSE_DONNEES final.md](ANALYSE_DONNEES final.md) : Analyse détaillée des données
- [scripts/bench.sh](scripts/bench.sh:1) : Script client amélioré
- [backend/app/schemas/hardware.py](backend/app/schemas/hardware.py) : Schémas Pydantic backend
- [backend/app/models/hardware_snapshot.py](backend/app/models/hardware_snapshot.py) : Modèle SQLAlchemy

---

## ✅ Checklist de Validation

- [x] Support nvidia-smi pour GPU NVIDIA
- [x] Parsing correct des caches CPU (L1 = L1d + L1i)
- [x] Collecte températures disques via smartctl
- [x] Collecte SMART health status
- [x] Correction pondérations score global (30/20/25/15/10)
- [x] Prise en compte du score réseau dans global_score
- [ ] Tests sur machine réelle avec GPU NVIDIA
- [ ] Tests sur machine avec plusieurs disques
- [ ] Validation des scores calculés

---

**Version du script** : 1.2.0
**Auteur** : Gilles @ maison43
**Date** : 13 décembre 2025
