352 lines
9.5 KiB
Markdown
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
|