251 lines
6.5 KiB
Markdown
Executable File
251 lines
6.5 KiB
Markdown
Executable File
# 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.0.50)...
|
|
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.
|
|
|
|
```bash
|
|
# ❌ 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`.
|
|
|
|
```bash
|
|
# ❌ 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 :
|
|
|
|
```bash
|
|
# ✅ 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) :
|
|
|
|
```bash
|
|
# ✅ 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é
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
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
|
|
|
|
- [x] Fix extraction throughput mémoire
|
|
- [x] Fix validation ping_ms
|
|
- [x] 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 :
|
|
|
|
```bash
|
|
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
|
|
|
|
- [HOTFIX_NETWORK_BENCH.md](HOTFIX_NETWORK_BENCH.md) - Fix safe_bc pour réseau
|
|
- [HOTFIX_SCORE_VALIDATION.md](HOTFIX_SCORE_VALIDATION.md) - Augmentation limite scores à 10000
|
|
- [bench.sh](scripts/bench.sh) - Script de benchmark client
|