Files
serv_benchmark/docs/CORRECTIFS_RESEAU_SMART.md
Gilles Soulier c67befc549 addon
2026-01-05 16:08:01 +01:00

213 lines
6.3 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Correctifs Réseau et SMART - 2025-12-14
## 🎯 Modifications Appliquées
### 1. Test Réseau Bidirectionnel (--bidir)
**Problème** : Le script effectuait 2 tests séparés (upload puis download), ce qui prenait 20 secondes et donnait parfois des résultats incohérents (upload=0).
**Solution** : Utiliser `iperf3 --bidir` pour tester upload ET download simultanément.
**Changements dans** : [scripts/bench.sh:786-827](scripts/bench.sh#L786-L827)
#### Avant (2 tests séparés - 20 secondes)
```bash
# Test upload
local upload_result=$(iperf3 -c "$target" -t 10 -J 2>/dev/null || echo '{}')
# ...
# Test download
local download_result=$(iperf3 -c "$target" -t 10 -R -J 2>/dev/null || echo '{}')
```
#### Après (1 test bidirectionnel - 10 secondes)
```bash
# Test bidirectionnel (upload + download simultanés)
local bidir_result=$(iperf3 -c "$target" -t 10 --bidir -J 2>/dev/null || echo '{}')
# Extraire upload (end.sum_sent) et download (end.sum_received)
local upload_bps=$(echo "$bidir_result" | jq -r '.end.sum_sent.bits_per_second // 0' | tr -d '\n')
local download_bps=$(echo "$bidir_result" | jq -r '.end.sum_received.bits_per_second // 0' | tr -d '\n')
```
**Avantages** :
-**2x plus rapide** : 10 secondes au lieu de 20
-**Plus fiable** : un seul test au lieu de deux
-**Résultats cohérents** : les deux directions testées simultanément
-**Conditions réelles** : simule une utilisation réseau bidirectionnelle
**Résultats attendus** (d'après test manuel) :
- Upload : ~359 Mbps
- Download : ~95 Mbps
---
### 2. Correction SMART Health et Température
**Problème** : Le script collectait les données SMART (santé et température des disques) mais le payload JSON les écrasait en les forçant à `null`.
**Solution** : Retirer le `null` forcé et utiliser les valeurs collectées.
**Changements dans** : [scripts/bench.sh:1005-1006](scripts/bench.sh#L1005-L1006)
#### Avant (données perdues)
```bash
storage: {
devices: [
$storage[]
| {
name: ("/dev/" + .device),
type: (.type | ascii_upcase),
interface,
capacity_gb: (.size_gb | tonumber? // .size_gb),
vendor: null,
model,
smart_health: null, # ← FORCÉ À NULL !
temperature_c: null # ← FORCÉ À NULL !
}
],
partitions: []
}
```
#### Après (données préservées)
```bash
storage: {
devices: [
$storage[]
| {
name: ("/dev/" + .device),
type: (.type | ascii_upcase),
interface,
capacity_gb: (.size_gb | tonumber? // .size_gb),
vendor: null,
model,
smart_health, # ← UTILISE LA VALEUR COLLECTÉE
temperature_c # ← UTILISE LA VALEUR COLLECTÉE
}
],
partitions: []
}
```
**Valeurs collectées** (lignes 546-555 de bench.sh) :
```bash
# Température (diverses variantes selon le type de disque)
# SATA/HDD: Temperature_Celsius, Airflow_Temperature_Cel, Current Drive Temperature (colonne 10)
# NVMe: Temperature: XX Celsius (colonne 2)
temperature=$(echo "$smart_all" | awk '/Temperature_Celsius|Airflow_Temperature_Cel|Current Drive Temperature/ {print $10}' | head -1)
[[ -z "$temperature" ]] && temperature=$(echo "$smart_all" | awk '/^Temperature:/ {print $2}' | head -1)
# Statut SMART health
health=$(sudo smartctl -H "/dev/$d" 2>/dev/null | awk '/SMART overall-health|SMART Health Status/ {print $NF}' | head -1)
```
**Support multi-types** :
- ✅ Disques SATA/HDD : pattern `Temperature_Celsius`
- ✅ Disques NVMe : pattern `Temperature:` (ligne 550)
- ✅ Fallback à `null` si non disponible
**Valeurs possibles** :
- `smart_health` : `"PASSED"`, `"FAILED"`, ou `null` si non disponible
- `temperature_c` : nombre (ex: 35, 42) ou `null` si non disponible
---
## 📋 Résumé des 5 Bugs Corrigés Aujourd'hui
| # | Bug | Impact | Statut | Fichier Modifié |
|---|-----|--------|--------|----------------|
| 1 | CPU cores = 0 | Impossible de voir le nombre de cœurs | ✅ Corrigé | bench.sh:241-250 |
| 2 | Backend ne met pas à jour | Données toujours null après 1er bench | ✅ Corrigé | backend/app/api/benchmark.py:52-132 |
| 3 | Benchmark réseau crash | Script plantait avec erreur jq | ✅ Corrigé | bench.sh:796-800 |
| 4 | SMART health/temp perdues | Température disques jamais transmise | ✅ Corrigé | bench.sh:1005-1006 |
| 5 | Test réseau lent/instable | Upload=0, 20s de test | ✅ Corrigé | bench.sh:786-827 |
---
## 🧪 Tests à Effectuer
### Test 1 : Vérifier le benchmark réseau
```bash
cd /home/gilles/Documents/vscode/serv_benchmark/scripts
sudo bash bench.sh
```
**Vérifications** :
- [ ] Upload > 0 Mbps (attendu : ~350-400 Mbps)
- [ ] Download > 0 Mbps (attendu : ~90-100 Mbps)
- [ ] Ping mesuré (attendu : ~7-10 ms)
- [ ] Test réseau prend ~10 secondes (pas 20)
### Test 2 : Vérifier les données SMART
```bash
# Vérifier manuellement qu'un disque retourne des données SMART
sudo smartctl -H /dev/sda
sudo smartctl -A /dev/sda | grep Temperature
```
**Ensuite, après le benchmark** :
```bash
# Vérifier que les données sont dans la base
curl -s http://10.0.0.50:8007/api/devices | jq '.[0].hardware_snapshots[0].storage_devices_json' | jq '.'
```
**Vérifications** :
- [ ] `smart_health` = `"PASSED"` (ou `"FAILED"`)
- [ ] `temperature_c` = nombre (ex: 35)
---
## 📊 Impact Performance
### Benchmark Réseau
- **Avant** : 2 tests × 10s = 20 secondes
- **Après** : 1 test × 10s = 10 secondes
- **Gain** : -50% de temps d'exécution
### Benchmark Total
- **Avant** : ~3 minutes 30 secondes
- **Après** : ~3 minutes 20 secondes
- **Gain** : -10 secondes
---
## 📝 Notes Techniques
### Format JSON iperf3 --bidir
Le mode bidirectionnel d'iperf3 retourne un JSON avec cette structure :
```json
{
"end": {
"sum_sent": {
"bits_per_second": 359123456.78
},
"sum_received": {
"bits_per_second": 95234567.89
}
}
}
```
- `sum_sent` = Upload (client → serveur)
- `sum_received` = Download (serveur → client)
### Extraction Robuste
Pour éviter les problèmes de retours chariot :
```bash
local value=$(echo "$json" | jq -r '.path.to.value // 0' | tr -d '\n')
```
Clés utilisées :
- `-r` : mode raw (pas de quotes)
- `// 0` : valeur par défaut si null
- `tr -d '\n'` : supprimer tous les retours chariot
---
**Document créé le** : 2025-12-14
**Version script** : 1.2.0
**Auteur** : Claude Code