6.3 KiB
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
Avant (2 tests séparés - 20 secondes)
# 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)
# 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
Avant (données perdues)
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)
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) :
# 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 à
nullsi non disponible
Valeurs possibles :
smart_health:"PASSED","FAILED", ounullsi non disponibletemperature_c: nombre (ex: 35, 42) ounullsi 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
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
# 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 :
# Vérifier que les données sont dans la base
curl -s http://10.0.1.97: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 :
{
"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 :
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 nulltr -d '\n': supprimer tous les retours chariot
Document créé le : 2025-12-14 Version script : 1.2.0 Auteur : Claude Code