Ambiente
- Abbiamo attività che può utilizzare multi-thread
- Il nostro compito utilizza sempre il 100% del processore, quindi definiamo 1 thread- 1 core .
- quando lanciamo una nuova attività, possiamo assegnare la quantità di thread che può avere.
- il tempo necessario per terminare i compiti è indeterminato, ma possiamo stimare il tempo richiesto con 1 thread (con circa il 25% di errore). ma quando usiamo più thread non è una progressione lineare. (con due thread non prendi la metà del tempo)
- Abbiamo un numero limitato di core. (ora ne abbiamo 36 ma potremmo cambiare)
Problema
Ora abbiamo un numero fisso di processori per attività (sempre 4 thread) che consente 9 task contemporaneamente senza problemi ... e una variabile che dice quanto task possiamo lanciare (doppio rispetto ai core ora, è il limite che testato che funziona lentamente ma funziona). In tempo di punta, quando vogliamo eseguire il numero massimo di attività possibile il server è impegnato rispetto all'attività, come 10 volte più lento del dovuto e ha errori di calcolo e fallisce.
Obiettivi
Vogliamo implementare un algoritmo che abbia un equilibrio tra velocità e numero di attività. Se il server è scaricato, utilizzare una buona parte di esso per elaborare più velocemente una o due attività ... ma se abbiamo più che le nuove attività ricevono un numero inferiore di thread. Vogliamo che l'attività massima funzioni simultaneamente (i lavori in coda fanno male a noi) ma con il tempo più lento possibile per l'attività (se mettiamo tutti i core funzionanti, nuova attività fai in modo che il tempo per l'attività aumenti in modo esponenziale)
Approssimazioni Mi sono allenato a pensare in modi diversi per risolverlo, ma non riuscivo a trovare nulla di ciò che mi convinceva.
OPZIONI (tutte scartate):
- Assegna il numero massimo di core liberi a una nuova attività e se non ne ho dato solo 1 core fino ad arrivare al massimo dell'attività (core * 2).
- vantaggio: 1 compito andare il più veloce possibile
- problema: > 1 attività. è il più lento possibile e rallenta anche il primo compito.
- Assegna la metà dei nuclei liberi a una nuova attività e, se non ne ho, dai solo 1 core fino ad arrivare al massimo dell'attività (core * 2).
- vantaggio: più attività stanno andando più velocemente
- problema: > 5 attività. è il più lento possibile e rallenta anche il primo compito.