Files
serv_benchmark/HOTFIX_BENCH_IMPROVEMENTS.md
2025-12-14 10:40:54 +01:00

6.5 KiB

Hotfix - Améliorations Benchmarks Mémoire et Réseau

Date : 13 décembre 2025 Version : 1.2.3 (script fix)

🐛 Problèmes Identifiés

Problème #1 : Erreur jq dans Benchmark Réseau

Symptômes :

✓ Benchmark Réseau en cours (vers 10.0.1.97)...
jq: invalid JSON text passed to --argjson
Use jq --help for help with command-line options,
or see the jq manpage, or online docs  at https://jqlang.github.io/jq

Cause Root : scripts/bench.sh:804

Le script passait une valeur invalide à --argjson ping quand ping_ms était vide ou contenait une chaîne non numérique.

# ❌ Code buggé
ping_ms=$(echo "$ping_output" | awk -F'/' '{print $5}')
# Si ping_output est vide, ping_ms est vide ""
# Puis on passe à jq :
--argjson ping "${ping_ms:-null}"
# Mais si ping_ms="", alors on passe --argjson ping "" ce qui est invalide

Impact : Erreur jq qui empêche la construction du JSON réseau


Problème #2 : Benchmark Mémoire Retourne 0 MiB/s

Symptômes :

✓ Benchmark Mémoire en cours...
✓ Mémoire: 0 MiB/s (score: 0)

Cause Root : scripts/bench.sh:693

Le pattern awk utilisé pour extraire le throughput ne correspondait pas au format de sortie de sysbench memory.

# ❌ Code buggé
thr=$(echo "$mem_res" | awk '/transferred/ {print $6}' | head -1)

Le problème :

  • Le format de sortie de sysbench memory a changé entre versions
  • Le champ 6 ne contient pas toujours le throughput
  • Le pattern /transferred/ ne matche pas toujours la bonne ligne

Impact : Score mémoire toujours à 0, faussant le score global


Corrections Appliquées

Fix #1 : Validation de ping_ms pour jq

Fichier : scripts/bench.sh:803-804

Ajout d'une validation avant de passer ping_ms à jq :

# ✅ Code corrigé
# S'assurer que ping_ms est une valeur valide pour jq
[[ -z "$ping_ms" || "$ping_ms" == "null" ]] && ping_ms="0"

net_bench=$(jq -n \
    --argjson upload "$upload_mbps" \
    --argjson download "$download_mbps" \
    --argjson ping "$ping_ms" \
    --argjson score "$net_score" \
    '{upload_mbps: $upload, download_mbps: $download, ping_ms: $ping, score: $score}')

Bénéfices :

  • Plus d'erreur jq même si le ping échoue
  • Valeur par défaut de 0 au lieu de null
  • JSON toujours valide

Fix #2 : Extraction Robuste du Throughput Mémoire

Fichier : scripts/bench.sh:693-696

Utilisation de plusieurs méthodes d'extraction (fallback) :

# ✅ Code corrigé
# Extraire le throughput - essayer plusieurs patterns
thr=$(echo "$mem_res" | grep -oP '\d+\.\d+(?= MiB/sec)' | head -1)
[[ -z "$thr" ]] && thr=$(echo "$mem_res" | awk '/transferred/ {print $(NF-1)}' | head -1)
[[ -z "$thr" ]] && thr=0

Explication :

  1. Première tentative : grep -oP '\d+\.\d+(?= MiB/sec)'

    • Recherche un nombre décimal suivi de " MiB/sec"
    • Fonctionne avec le format moderne de sysbench
  2. Deuxième tentative : awk '/transferred/ {print $(NF-1)}'

    • Prend l'avant-dernier champ de la ligne contenant "transferred"
    • Fonctionne avec les anciennes versions de sysbench
  3. Fallback : thr=0

    • Si rien ne fonctionne, utilise 0 au lieu de planter

Bénéfices :

  • Compatible avec plusieurs versions de sysbench
  • Extrait correctement le throughput
  • Graceful degradation si extraction échoue

🧪 Tests

Test 1 : Benchmark Réseau avec Ping Échoué

# Simuler un ping qui échoue
sudo bash scripts/bench.sh

# Attendu:
# ✓ Réseau: ↑945.23Mbps ↓943.12Mbps (ping: 0ms, score: 94.41)
# Pas d'erreur jq

Test 2 : Benchmark Mémoire

# Exécuter le benchmark
sudo bash scripts/bench.sh

# Attendu:
# ✓ Mémoire: 10845.23 MiB/s (score: 108.45)
# Au lieu de:
# ✓ Mémoire: 0 MiB/s (score: 0)

Test 3 : Benchmark Complet

sudo bash scripts/bench.sh

# Vérifier que toutes les valeurs sont correctes:
# ✓ CPU: > 0
# ✓ Mémoire: > 0 (nouveau!)
# ✓ Disque: > 0
# ✓ Réseau: > 0 (sans erreur jq!)
# ✓ Score global: cohérent

📊 Format de Sortie Sysbench Memory

Pour référence, voici les formats possibles de sortie de sysbench memory :

Format moderne (sysbench 1.0+)

Total operations: 104857600 (10485745.23 per second)

102400.00 MiB transferred (10239.99 MiB/sec)

Notre pattern grep -oP '\d+\.\d+(?= MiB/sec)' extrait : 10239.99

Format ancien (sysbench 0.5)

102400.00 MiB transferred (10239.99 MiB/sec total)
Operations performed:  104857600 (10485745.23 ops/sec)

Notre fallback awk '/transferred/ {print $(NF-1)}' extrait l'avant-dernier champ.


🔧 Fichiers Modifiés

Fichier Lignes Type Description
scripts/bench.sh 693-696 Fix Extraction robuste throughput mémoire
scripts/bench.sh 803-804 Fix Validation ping_ms pour jq

📝 Notes de Version

Version : Script 1.2.3 Date : 13 décembre 2025 Type : Hotfix Impact : Benchmark mémoire et réseau

Changements

  • Fix : Extraction du throughput mémoire avec fallback multi-pattern
  • Fix : Validation de ping_ms avant passage à jq
  • Robustesse : Compatible avec plusieurs versions de sysbench
  • Graceful degradation : Valeurs par défaut au lieu d'erreurs

Checklist de Validation

  • Fix extraction throughput mémoire
  • Fix validation ping_ms
  • Documenter les corrections
  • Tester benchmark complet
  • Vérifier que mémoire > 0
  • Vérifier que réseau sans erreur jq
  • Vérifier score global cohérent

🚀 Déploiement

Le script bench.sh a été modifié localement. Pour l'appliquer :

cd /home/gilles/Documents/vscode/serv_benchmark

# Tester le script modifié
sudo bash scripts/bench.sh

# Si OK, commit
git add scripts/bench.sh
git commit -m "fix(bench): Improve memory throughput extraction and network ping validation

- Add multi-pattern fallback for sysbench memory output parsing
- Validate ping_ms value before passing to jq --argjson
- Compatible with multiple sysbench versions
- Prevents jq errors in network benchmark
"

Status : Fix appliqué et prêt à tester Prochaine action : Exécuter sudo bash scripts/bench.sh et vérifier les résultats


🔗 Fichiers Liés