Stima il tempo rimanente in una coda con più lavoratori

1

Ho cercato di calcolare un modo di calcolare il tempo rimanente stimato per un articolo in una coda quando ci sono più lavoratori che elaborano gli articoli dalla singola coda.

Un client inoltra un lavoro alla coda, ma poiché l'elaborazione può richiedere del tempo, desidero fornire una stima del feedback.

Lo so

  • Numero di elementi nella coda
  • Posizione in coda
  • Durata del processo di elaborazione di un elemento *
  • Quanti lavoratori sono in esecuzione
  • Quando ogni lavoratore ha completato un lavoro

Non lo so

  • Quanto è lungo l'elaborazione del worker, solo quando inizia e finisce **

* Il tempo di elaborazione è il tempo di elaborazione del 90 ° percentile dei lavori passati in un intervallo di tempo ragionevole. Non completamente accurato, ma tende a sovrastimare leggermente ed è abbastanza preciso per le mie esigenze.
** I lavoratori chiamano un servizio esterno, quindi la migliore stima del progresso è il tempo impiegato

Con un singolo lavoratore posso usare una funzione come

estimated_seconds_remaining = (
    (position_in_queue + 1) * average_processing_time_seconds
) - (
    average_processing_time_seconds - time_since_worker_last_finished_seconds
)

(position_in_queue + 1) * average_processing_time_seconds mi dà il tempo necessario per elaborare tutti gli elementi nella coda più quello che è attualmente in fase di elaborazione, quindi togliere average_processing_time_seconds - time_since_worker_last_finished_seconds mi dà il tempo rimanente stimato per elaborare l'elemento corrente della coda.

Funziona abbastanza bene ed è sufficientemente accurato per la segnalazione in quanto la variazione dei tempi di elaborazione è piuttosto ridotta.

Tuttavia, in produzione eseguirò più worker, quindi più worker elaboreranno gli articoli dalla stessa coda. Molto probabilmente ci saranno 3 o 4 lavoratori in esecuzione, ma a volte potrebbero essere in aumento di 10.

L'opzione più semplice è solo modificare la mia formula in modo

estimated_seconds_remaining = (
    (position_in_queue + 1)/number_of_workers * average_processing_time_seconds
) - (
    average_processing_time_seconds/number_of_workers - time_since_worker_last_finished_seconds
)

Ma questo fornisce previsioni imprecise e errate, dal momento che le stime vengono ricalcolate ogni secondo per aggiornare la visualizzazione, i tempi salgono e scendono secondo quando i lavoratori finiscono tutti i loro lavori.

C'è un modo semplice, con le informazioni che ho, di calcolare una previsione ragionevolmente accurata del tempo rimanente prima che un articolo dalla coda venga elaborato?

    
posta Smudge 27.02.2014 - 02:25
fonte

1 risposta

1

Certo, quello che puoi fare è adattare la tua seconda equazione. Penso che sia fondamentalmente giusto, ma il problema è che i lavoratori potrebbero finire tutti all'incirca nello stesso periodo, in modo che il secondo termine possa saltare un po '.

Quello che suggerirei sarebbe di tenere traccia del tempo di terminazione di ciascun lavoratore individualmente. Puoi anche tenere traccia dei loro tempi di elaborazione medi individuali, ma per semplicità continuerò a supporre che sia costante.

Quindi ora la funzione diventa:

(position_in_queue) / (avg_worker_processing_time / workers_count)
+ time_until_most_advanced_worker_completes_processing

che rimane valido fino a quando la tua posizione è 0, a quel punto ovviamente vuoi segnalare time_until_worker_that_has_my_task_completes_processing .

Questo dovrebbe essere molto più agevole, dato che time_until_most_advanced_worker_completes_processing andrà a circa zero perfettamente e poi andrai avanti di uno spot (riducendo il tempo) e allo stesso tempo il prossimo time_until_most_advanced_worker_completes_processing aumenterà un po '(mantenendo liscia discesa).

Spero che ti aiuti!

    
risposta data 27.02.2014 - 02:56
fonte

Leggi altre domande sui tag