2.3 KiB
2.3 KiB
Piano di Refactor: Ottimizzazione Simulatore (Simula.cs)
Obiettivo Primario: Ridurre il consumo di CPU reale (visto da Proxmox) minimizzando il context switching e la saturazione dei thread, senza modificare la classe base Generic o l'architettura WinForms.
Strategia di Intervento
L'approccio si basa sul concetto di "Staggering & Throttling": disallineare le istanze tra loro e ridurre la frequenza delle operazioni che generano traffico o context switch.
Fase 1: Disallineamento delle Istanze (Jittering) - [COMPLETATA]
Per evitare il fenomeno del "Thundering Herd" (tutte le decine di istanze che si svegliano e lavorano nello stesso millisecondo), implementeremo:
- Jitter di Inizializzazione: Un ritardo casuale all'avvio dei task (aumentato a 10s).
- Jitter dei Periodi: Applicazione di un rumore statistico ai periodi di esecuzione (
periodoMSec) per evitare che le frequenze di polling si sincronizzino tra le varie VM.
Fase 2: Riduzione del Carico di Comunicazione (Throttling I/O) - [COMPLETATA]
Ridurre il numero di chiamate verso Redis e il Server MES/IO:
- Filtro "Change-Only" (Dirty Check): Prima di chiamare metodi come
upsertKeyotrySendPzCountBlock, verifichiamo rigorosamente se il valore simulato è effettivamente diverso dall'ultimo valore inviato con successo (lastSentPzCount). - Throttling Decodifica: Limitazione della frequenza di
decodeToBaseBitmap(max ogni 500ms) per evitare chiamate HTTP sincrone troppo frequenti.
Fase 3: Ottimizzazione della Logica Interna e Async - [COMPLETATA]
- Eliminazione Sync-over-Async: Rimozione massiccia dei pattern
.GetAwaiter().GetResult()eTask.Run(...).GetResult(). - Fire-and-Forget Controllato: Utilizzo di
_ = Task.Run(async () => ...)per i processi di sincronizzazione (ProcessDataSync) e caricamento (Simula_Load), evitando di bloccare i thread di polling o di sistema. - Riduzione verbosità: (Opzionale/In corso) Minimizzazione dei log nei cicli critici.
Stato del Lavoro
- Analisi completa della gerarchia e dei colli di bottiglia.
- Implementazione Fase 1 (Jittering).
- Implementazione Fase 2 (Dirty Check I/O & Bitmap Throttling).
- Implementazione Fase 3 (Rimozione ponti Sync-over-Async).
- Test e verifica (Simulazione in ambiente controllato).
- Rollout/Test in produzione.