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

6.3 KiB
Executable File
Raw Permalink Blame History

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 à 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

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.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 :

{
  "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 null
  • tr -d '\n' : supprimer tous les retours chariot

Document créé le : 2025-12-14 Version script : 1.2.0 Auteur : Claude Code