# 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