Files
Mapo-IOB-WIN/Refactor_Plan_Simula.md
T
2026-05-19 17:05:15 +02:00

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 upsertKey o trySendPzCountBlock, 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() e Task.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.