maj
This commit is contained in:
257
DEBUG_NETWORK_BENCH.md
Normal file
257
DEBUG_NETWORK_BENCH.md
Normal file
@@ -0,0 +1,257 @@
|
||||
# Debug - Benchmark Réseau (erreur jq)
|
||||
|
||||
Date : 13 décembre 2025
|
||||
Version : 1.2.4 (debug)
|
||||
|
||||
## 🐛 Problème à Déboguer
|
||||
|
||||
### Symptômes
|
||||
Erreur persistante dans le benchmark réseau :
|
||||
```
|
||||
✓ 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
|
||||
```
|
||||
|
||||
### Contexte
|
||||
- Le benchmark mémoire fonctionne maintenant correctement (8667.08 MiB/s)
|
||||
- Les scores CPU et Disque sont élevés mais acceptés (validation à 10000)
|
||||
- L'erreur jq se produit lors de la construction du JSON réseau
|
||||
|
||||
### Hypothèses
|
||||
1. Une des valeurs `upload_mbps`, `download_mbps`, `ping_ms` ou `net_score` est invalide
|
||||
2. La valeur peut contenir des caractères non numériques
|
||||
3. La valeur peut être vide `""` au lieu de `"0"` ou `"null"`
|
||||
4. `safe_bc()` peut retourner une valeur non numérique dans certains cas
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Debug Ajouté
|
||||
|
||||
### Code Debug (lignes 785-820)
|
||||
|
||||
```bash
|
||||
# Extraction upload
|
||||
local upload_bps=$(echo "$upload_result" | jq '.end.sum_sent.bits_per_second // 0')
|
||||
echo " [DEBUG] upload_bps extrait de iperf3='$upload_bps'" >&2
|
||||
upload_mbps=$(safe_bc "scale=2; $upload_bps / 1000000")
|
||||
echo " [DEBUG] upload_mbps après conversion='$upload_mbps'" >&2
|
||||
|
||||
# Extraction download
|
||||
local download_bps=$(echo "$download_result" | jq '.end.sum_received.bits_per_second // 0')
|
||||
echo " [DEBUG] download_bps extrait de iperf3='$download_bps'" >&2
|
||||
download_mbps=$(safe_bc "scale=2; $download_bps / 1000000")
|
||||
echo " [DEBUG] download_mbps après conversion='$download_mbps'" >&2
|
||||
|
||||
# Extraction ping
|
||||
local ping_output=$(ping -c 5 "$target" 2>/dev/null | grep 'avg' || echo "")
|
||||
echo " [DEBUG] ping_output='$ping_output'" >&2
|
||||
if [[ -n "$ping_output" ]]; then
|
||||
ping_ms=$(echo "$ping_output" | awk -F'/' '{print $5}')
|
||||
echo " [DEBUG] ping_ms extrait='$ping_ms'" >&2
|
||||
fi
|
||||
|
||||
# Calcul score
|
||||
local net_score=$(safe_bc "scale=2; ($upload_mbps + $download_mbps) / 20")
|
||||
|
||||
# Validation avant jq
|
||||
[[ -z "$ping_ms" || "$ping_ms" == "null" ]] && ping_ms="0"
|
||||
|
||||
# DEBUG: Afficher les valeurs avant jq
|
||||
echo " [DEBUG] upload_mbps='$upload_mbps' download_mbps='$download_mbps' ping_ms='$ping_ms' net_score='$net_score'" >&2
|
||||
|
||||
# Appel jq avec capture d'erreur
|
||||
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}' 2>&1)
|
||||
|
||||
local jq_exit_code=$?
|
||||
if [[ $jq_exit_code -ne 0 ]]; then
|
||||
log_error "Erreur jq lors de la construction du JSON réseau"
|
||||
echo " [DEBUG] Sortie jq: $net_bench" >&2
|
||||
echo " [DEBUG] Valeurs: upload='$upload_mbps' download='$download_mbps' ping='$ping_ms' score='$net_score'" >&2
|
||||
net_bench="null"
|
||||
fi
|
||||
```
|
||||
|
||||
### Fichiers Modifiés
|
||||
|
||||
| Fichier | Lignes | Type | Description |
|
||||
|---------|--------|------|-------------|
|
||||
| `scripts/bench.sh` | 785-787 | Debug | Upload bps extraction et conversion |
|
||||
| `scripts/bench.sh` | 793-795 | Debug | Download bps extraction et conversion |
|
||||
| `scripts/bench.sh` | 800-803 | Debug | Ping extraction |
|
||||
| `scripts/bench.sh` | 807 | Debug | Valeurs finales avant jq |
|
||||
| `scripts/bench.sh` | 814-822 | Debug | Capture erreur jq et affichage détaillé |
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Test avec Debug
|
||||
|
||||
### Commande
|
||||
```bash
|
||||
sudo bash scripts/bench.sh 2>&1 | tee /tmp/bench_debug.log
|
||||
```
|
||||
|
||||
### Sortie Attendue
|
||||
|
||||
Si tout fonctionne correctement :
|
||||
```
|
||||
✓ Benchmark Réseau en cours (vers 10.0.1.97)...
|
||||
[DEBUG] upload_bps extrait de iperf3='945230000'
|
||||
[DEBUG] upload_mbps après conversion='945.23'
|
||||
[DEBUG] download_bps extrait de iperf3='943120000'
|
||||
[DEBUG] download_mbps après conversion='943.12'
|
||||
[DEBUG] ping_output='rtt min/avg/max/mdev = 0.280/0.342/0.450/0.062 ms'
|
||||
[DEBUG] ping_ms extrait='0.342'
|
||||
[DEBUG] upload_mbps='945.23' download_mbps='943.12' ping_ms='0.342' net_score='94.41'
|
||||
✓ Réseau: ↑945.23Mbps ↓943.12Mbps (ping: 0.342ms, score: 94.41)
|
||||
```
|
||||
|
||||
Si erreur :
|
||||
```
|
||||
✓ Benchmark Réseau en cours (vers 10.0.1.97)...
|
||||
[DEBUG] upload_bps extrait de iperf3='945230000'
|
||||
[DEBUG] upload_mbps après conversion='945.23'
|
||||
[DEBUG] download_bps extrait de iperf3='[VALEUR_PROBLEMATIQUE]'
|
||||
[DEBUG] download_mbps après conversion='[VALEUR_PROBLEMATIQUE]'
|
||||
[DEBUG] ping_output='...'
|
||||
[DEBUG] ping_ms extrait='...'
|
||||
[DEBUG] upload_mbps='945.23' download_mbps='[VALEUR_PROBLEMATIQUE]' ping_ms='...' net_score='...'
|
||||
✗ Erreur jq lors de la construction du JSON réseau
|
||||
[DEBUG] Sortie jq: jq: invalid JSON text passed to --argjson
|
||||
[DEBUG] Valeurs: upload='945.23' download='[VALEUR_PROBLEMATIQUE]' ping='...' score='...'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Cas à Tester
|
||||
|
||||
### Cas 1 : iperf3 retourne null
|
||||
Si iperf3 retourne un JSON sans les champs attendus :
|
||||
```json
|
||||
{
|
||||
"end": {}
|
||||
}
|
||||
```
|
||||
Alors `jq '.end.sum_sent.bits_per_second // 0'` devrait retourner `0`.
|
||||
|
||||
**Vérification** : `upload_bps` devrait être `0`
|
||||
|
||||
### Cas 2 : iperf3 retourne une chaîne
|
||||
Si pour une raison quelconque, jq retourne `"null"` (string) au lieu de `null` :
|
||||
```bash
|
||||
upload_bps="null" # String, pas JSON null
|
||||
```
|
||||
Alors `safe_bc "scale=2; null / 1000000"` peut échouer ou retourner une valeur bizarre.
|
||||
|
||||
**Vérification** : `upload_mbps` devrait être `0` grâce à safe_bc
|
||||
|
||||
### Cas 3 : safe_bc retourne une valeur vide
|
||||
Si `safe_bc` échoue silencieusement et retourne `""` :
|
||||
```bash
|
||||
upload_mbps=""
|
||||
```
|
||||
Alors `--argjson upload ""` causera l'erreur jq.
|
||||
|
||||
**Vérification** : Le debug montrera `upload_mbps=''`
|
||||
|
||||
### Cas 4 : Ping retourne une valeur avec espace ou caractère spécial
|
||||
Si le ping contient des caractères non numériques :
|
||||
```bash
|
||||
ping_ms="0.342 " # Espace en fin
|
||||
ping_ms=" 0.342" # Espace en début
|
||||
ping_ms="0,342" # Virgule au lieu de point
|
||||
```
|
||||
Alors jq rejettera la valeur.
|
||||
|
||||
**Vérification** : Le debug montrera les espaces ou caractères
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Corrections Potentielles
|
||||
|
||||
### Fix 1 : Valider toutes les valeurs numériques avant jq
|
||||
|
||||
```bash
|
||||
# Valider upload_mbps
|
||||
[[ -z "$upload_mbps" || ! "$upload_mbps" =~ ^[0-9.]+$ ]] && upload_mbps="0"
|
||||
|
||||
# Valider download_mbps
|
||||
[[ -z "$download_mbps" || ! "$download_mbps" =~ ^[0-9.]+$ ]] && download_mbps="0"
|
||||
|
||||
# Valider ping_ms
|
||||
[[ -z "$ping_ms" || ! "$ping_ms" =~ ^[0-9.]+$ ]] && ping_ms="0"
|
||||
|
||||
# Valider net_score
|
||||
[[ -z "$net_score" || ! "$net_score" =~ ^[0-9.]+$ ]] && net_score="0"
|
||||
```
|
||||
|
||||
### Fix 2 : Améliorer safe_bc pour toujours retourner un nombre
|
||||
|
||||
```bash
|
||||
safe_bc() {
|
||||
local expr="$1"
|
||||
local out
|
||||
out=$(echo "$expr" | bc 2>/dev/null) || out="0"
|
||||
# Si out est vide ou non numérique, forcer à 0
|
||||
[[ -z "$out" || ! "$out" =~ ^-?[0-9.]+$ ]] && out="0"
|
||||
echo "$out"
|
||||
}
|
||||
```
|
||||
|
||||
### Fix 3 : Nettoyer ping_ms des espaces
|
||||
|
||||
```bash
|
||||
# Nettoyer les espaces dans ping_ms
|
||||
ping_ms=$(echo "$ping_ms" | tr -d ' \t\n\r')
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Prochaines Étapes
|
||||
|
||||
1. **Exécuter le benchmark avec debug** :
|
||||
```bash
|
||||
sudo bash scripts/bench.sh 2>&1 | tee /tmp/bench_debug.log
|
||||
```
|
||||
|
||||
2. **Analyser la sortie debug** :
|
||||
- Identifier quelle valeur cause l'erreur
|
||||
- Noter la valeur exacte (y compris espaces invisibles)
|
||||
|
||||
3. **Appliquer le fix approprié** :
|
||||
- Si c'est une valeur vide : validation avant jq
|
||||
- Si c'est une valeur non numérique : améliorer safe_bc
|
||||
- Si c'est un espace/caractère : nettoyage avec `tr`
|
||||
|
||||
4. **Retester** :
|
||||
- Vérifier que l'erreur jq a disparu
|
||||
- Vérifier que les valeurs réseau sont correctes
|
||||
- Désactiver le debug une fois corrigé
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notes
|
||||
|
||||
- Le debug est affiché sur stderr (`>&2`) pour ne pas polluer stdout
|
||||
- Le code de sortie de jq est capturé avec `$?`
|
||||
- Si jq échoue, `net_bench` est mis à `"null"` pour éviter de planter le script
|
||||
- Tous les messages debug commencent par `[DEBUG]` pour faciliter le grep
|
||||
|
||||
---
|
||||
|
||||
**Status** : ⏳ Debug ajouté, en attente de test
|
||||
**Prochaine action** : Exécuter le benchmark et analyser la sortie debug
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Fichiers Liés
|
||||
|
||||
- [HOTFIX_NETWORK_BENCH.md](HOTFIX_NETWORK_BENCH.md) - Fix safe_bc précédent
|
||||
- [HOTFIX_BENCH_IMPROVEMENTS.md](HOTFIX_BENCH_IMPROVEMENTS.md) - Fixes mémoire et ping
|
||||
- [bench.sh](scripts/bench.sh) - Script de benchmark client
|
||||
Reference in New Issue
Block a user