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

352 lines
9.5 KiB
Markdown

# 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.1.97 -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