Sto cercando un algoritmo da utilizzare o come punto di partenza per il bilanciamento del carico.
Ambiente: Abbiamo ~ 7 tipi di lavoro che possono essere programmati in qualsiasi momento dai nostri utenti. Alcuni lavori sono veloci, altri lenti (molta elaborazione dei dati). Abbiamo una singola istanza di un "processore del lavoro" che scoprirà i lavori che sono stati pianificati e quindi li eseguirà. Il "processore del lavoro" eseguirà fino a 5 lavori alla volta, "thread".
Il problema è che un lavoro potrebbe consumare così tante risorse che gli altri 4 lavori non vengono elaborati e, peggio ancora, gli altri lavori pianificati sono ritardati per lunghi periodi di tempo.
Alcuni lavori possono essere programmati come "esegui immediatamente", il che li rende subito in linea.
Soluzione: Aggiungi altre istanze del "processore di processo". Abbiamo un grande server VM che l'IT sta implementando 3 VM per gestire ciascuna un'istanza di questo "processore di processi".
Per impostazione predefinita, sarà di aiuto, ma credo che ci dovrebbe essere più pensiero dietro di esso.
La mia soluzione: Oltre a rendere orizzontale la scala dei "processori di lavoro", ritengo che ci sia bisogno di un modo per determinare quali lavori occuperanno un'istanza sulla base del carico corrente dell'istanza e anche di consentire una distorsione.
Suggerisco di determinare le statistiche per ogni tipo di lavoro (tempo di esecuzione medio, ecc.) e dargli un punteggio compreso tra 1 e 5 (5 è di lunga durata). Ogni istanza determinerà quale sia il suo carico corrente sia in base al punteggio totale dei lavori attualmente in esecuzione, sia in base al suo bias. Ad esempio, penso che dovremmo essere in grado di impostare un'istanza per essere distorti verso piccoli lavori in modo da evitare lavori più grandi mentre un'altra istanza è distorta verso lavori di media entità, ecc.
Sto cercando un consiglio su come procedere. I lavori possono consumare grandi quantità di tempo, CPU e / o memoria. Il mio obiettivo è quello di assicurarmi che ogni istanza stia solo riducendo il lavoro che è in grado di fare mantenendo la coda di lavoro pianificata che si muove il più rapidamente possibile.
Uno degli altri sviluppatori ha suggerito di lasciare i "processori del lavoro" da soli per estrarre ciò che è in coda o "round robin". Dico che questo potrebbe portare a un potenziale problema in cui una singola istanza ha abbattuto troppi lavori di grandi dimensioni e sta faticando a farli terminare mentre le altre istanze sono inattive.