Hiskrtapps
18-11-2011, 18:39
Sono alle prese con la gestione della paralizzazione di alcuni processi.
Diciamo che ho un processo parallelizzabile; questo processo è gestito da un Executor che delega a più Workers parti di questo processo.
Il requisito è che questo algoritmo sia adattativo, cioè, il numero di Workers non è deciso preventivamente ma si seleziona man mano che il processo viene eseguito analizzando il throughput totale e altri dati a disposizione.
In pratica ecco i punti fondamentali:
- L'Executor parte, istanzia un Worker e gli assegna una parte di lavoro.
- Ogni volta che un Worker ha eseguito il suo lavoro richiede all'Executor nuovo lavoro; l'Executor glielo da finchè c'è Lavoro.
- Ogni tot tempo l'Executor si sveglia, controlla i dati dei suoi Workers e decide se aggiungere o rimuovere Workers o tenere invariato il loro numero, per massimizzare il loro throughput.
(Questo è necessario perchè il carico dell'ambiente su cui gira il processo è molto variabile).
I dati disposizione dell'Executor sono:
- la lunghezza del lasso di tempo dall'ultima volta che ha controllato
- unità di lavoro svolta da ogni Worker in quel lasso di tempo; la somma di tutte le unità di lavoro di tutti gli Worker in quel lasso di tempo è il throughput di quel lasso di tempo
- numero di Worker che hanno lavorato in quel lasso di tempo
- Uno storico delle informazioni relative a lassi di tempo precedenti a questo
L'idea di base per fare eseguire questa valutazione è la seguente:
- se il throughput attuale è maggiore di x% rispetto a quello precedente aggiungi un Worker
- se il throughput attuale è inferiore di x% rispetto a quello precedente rimuovi un Worker
- altrimenti mantieni il numero di Worker attuale
Per quanto sembri vincente questo algoritmo non si comporta in maniera ottimale e sebbene il funzionamento si avvicini a quello voluto il risultato è ancora poco soddisfacente.
I problemi principali che posso indicare sono questi:
- se ho un Worker che funziona al massimo (diciamo throughput costante da molto tempo) come fa il mio Executor a sapere che con un Worker in più andrebbe più veloce? (es. perchè abbiamo un altro processore a disposizione);
- se ho un Worker che funziona al massimo (diciamo throughput costante da molto tempo) come fa il mio Executor a sapere che con un Worker in meno andrebbe più veloce?
La mia domanda è: esistono algoritmi già esistenti e documentati da poter implementare senza che mi inventi l'acqua calda?
Spero di aver spiegato il mio problema che mi sembra un buon argomento di discussione.
Grazie!
Diciamo che ho un processo parallelizzabile; questo processo è gestito da un Executor che delega a più Workers parti di questo processo.
Il requisito è che questo algoritmo sia adattativo, cioè, il numero di Workers non è deciso preventivamente ma si seleziona man mano che il processo viene eseguito analizzando il throughput totale e altri dati a disposizione.
In pratica ecco i punti fondamentali:
- L'Executor parte, istanzia un Worker e gli assegna una parte di lavoro.
- Ogni volta che un Worker ha eseguito il suo lavoro richiede all'Executor nuovo lavoro; l'Executor glielo da finchè c'è Lavoro.
- Ogni tot tempo l'Executor si sveglia, controlla i dati dei suoi Workers e decide se aggiungere o rimuovere Workers o tenere invariato il loro numero, per massimizzare il loro throughput.
(Questo è necessario perchè il carico dell'ambiente su cui gira il processo è molto variabile).
I dati disposizione dell'Executor sono:
- la lunghezza del lasso di tempo dall'ultima volta che ha controllato
- unità di lavoro svolta da ogni Worker in quel lasso di tempo; la somma di tutte le unità di lavoro di tutti gli Worker in quel lasso di tempo è il throughput di quel lasso di tempo
- numero di Worker che hanno lavorato in quel lasso di tempo
- Uno storico delle informazioni relative a lassi di tempo precedenti a questo
L'idea di base per fare eseguire questa valutazione è la seguente:
- se il throughput attuale è maggiore di x% rispetto a quello precedente aggiungi un Worker
- se il throughput attuale è inferiore di x% rispetto a quello precedente rimuovi un Worker
- altrimenti mantieni il numero di Worker attuale
Per quanto sembri vincente questo algoritmo non si comporta in maniera ottimale e sebbene il funzionamento si avvicini a quello voluto il risultato è ancora poco soddisfacente.
I problemi principali che posso indicare sono questi:
- se ho un Worker che funziona al massimo (diciamo throughput costante da molto tempo) come fa il mio Executor a sapere che con un Worker in più andrebbe più veloce? (es. perchè abbiamo un altro processore a disposizione);
- se ho un Worker che funziona al massimo (diciamo throughput costante da molto tempo) come fa il mio Executor a sapere che con un Worker in meno andrebbe più veloce?
La mia domanda è: esistono algoritmi già esistenti e documentati da poter implementare senza che mi inventi l'acqua calda?
Spero di aver spiegato il mio problema che mi sembra un buon argomento di discussione.
Grazie!