Files
serv_benchmark/AMELIORATIONS_SCRIPT.md
2025-12-14 10:40:54 +01:00

9.5 KiB

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 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é :

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 :

{
  "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é :

# 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é :

# 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 :

{
  "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é :

# 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

{
  "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

{
  "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

# 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

# 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

# S'assurer qu'un serveur iperf3 est accessible
iperf3 -c 10.0.1.97 -t 5
# → Le score global doit inclure le score réseau (15%)

Test 4 : Cache L1 CPU

# 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


Checklist de Validation

  • Support nvidia-smi pour GPU NVIDIA
  • Parsing correct des caches CPU (L1 = L1d + L1i)
  • Collecte températures disques via smartctl
  • Collecte SMART health status
  • Correction pondérations score global (30/20/25/15/10)
  • 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