addon
This commit is contained in:
212
docs/CORRECTIFS_RESEAU_SMART.md
Executable file
212
docs/CORRECTIFS_RESEAU_SMART.md
Executable file
@@ -0,0 +1,212 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user