31 lines
1.6 KiB
Markdown
31 lines
1.6 KiB
Markdown
# WIP - Refactor Simulatore
|
|
|
|
## Analisi Ereditarietà
|
|
- Simula.cs -> Generic (Generic.Protected.cs / Generic.Public.cs)
|
|
- Classe `simPar`: Gestisce durata e attesa eventi simulati
|
|
|
|
## Criticità Riscontrate (CPU & Context Switch)
|
|
1. **Sync-over-Async**: Uso massiccio di `Task.Run(...).GetAwaiter().GetResult()` in `Simula_Load` e `ProcessDataSync`. Questo blocca i thread e aumenta il context switching.
|
|
2. **Polling Frequente**:
|
|
- `processVHF()`: Gestisce i decrementi dei timer basandosi su `periodoMSec`.
|
|
- `getDynData()`: Genera dati random walk/level basandosi su `waitSimPar`.
|
|
3. **Operazioni I/O Sincrone**: Uso di `HttpService.CallUrl` all'interno di cicli di simulazione/polling.
|
|
|
|
## Strategie di Intervento Applicate
|
|
|
|
### 1. Jittering (Disallineamento) [DONE]
|
|
- Aumentato jitter di avvio fino a 10s nel costruttore.
|
|
- Applicato rumore statistico (±15% + jitter extra) al `periodoMSec` per evitare la sincronizzazione delle VM.
|
|
|
|
### 2. Throttling e Dirty Check [DONE]
|
|
- **Contapezzi:** Implementato `lastSentPzCount` per inviare dati solo se il valore è effettivamente cambiato.
|
|
- **Bitmap:** Implementato throttling su `decodeToBaseBitmap` (limite 500ms) per ridurre chiamate HTTP sincrone e calcoli pesanti.
|
|
|
|
### 3. Refactor Async/Sync [DONE]
|
|
- Eliminato l'uso di `.GetAwaiter().GetResult()` in `Simula_Load` e `ProcessDataSync`.
|
|
- Convertito il caricamento e la sincronizzazione in task "fire-and-forget" controllati (`_ = Task.Run(...)`), liberando immediatamente i thread di polling/sistema.
|
|
|
|
## Stato Finale
|
|
- [x] Implementazione completa delle fasi di refactor su `Simula.cs`.
|
|
- [ ] Fase di test in ambiente di staging/produzione per monitoraggio CPU Proxmox.
|