Approcci per ottenere statistiche come la latenza media negli ultimi N secondi

0

Ricevo messaggi con informazioni sulla latenza ( LI , {date, latency}).

  1. Per ragioni statistiche: (sono aperto a circa approcci, il monitoraggio delle statistiche sarà aggiornato tra 6-60 secondi)

    • Voglio monitorare ( A = Average) la latenza media negli ultimi 60 secondi per i messaggi in arrivo
    • Voglio monitorare ( R = Tasso) il conteggio dei messaggi che superano la soglia ( T ) / il conteggio dei messaggi negli ultimi 60 secondi per i messaggi in arrivo
  2. E dovrei anche generare un avviso se i messaggi superano la soglia T entro un intervallo 0 < I < 2048 secondi (ultimo I secondi) hanno un conteggio superiore a C .

    • I = 0 significa dall'inizio (non una finestra scorrevole)
    • Se viene creato un avviso, reimposterà i contatori e l'intervallo.

Quali strutture dati e algoritmi consigliate per il problema precedente? (La velocità di ricezione del mio messaggio è di 400 messaggi al secondo)

    
posta user706071 14.02.2015 - 16:05
fonte

2 risposte

1

Dato che dici che le approssimazioni funzioneranno per te, quello che farei è che selezionerei un intervallo di tempo come 1 secondo e lo tratterei come un quantum. Registrerei tutte le informazioni di interesse da ogni evento accaduto durante il quantum, e alla fine del quantum vorrei riassumere tutto ciò che accadeva e scartare i dettagli in preparazione per la registrazione delle informazioni sul prossimo quanto.

I sommari generati per ogni quantum sarebbero memorizzati in una coda per i calcoli della media corrente. Un tempo di un secondo e un requisito di storicità di 2048 secondi significherebbe che la tua coda dovrebbe avere solo un massimo di 2048 voci.

Sembra che tu sia disposto a permettersi dieci volte le risorse di calcolo necessarie per affrontare il problema, quindi puoi sicuramente calcolare le medie da zero, se lo desideri, (consiglio: fallo comunque per i test), ma se ti interessi un algoritmo altamente efficiente per il calcolo della media di finestre scorrevoli, è il seguente:

  • Sia presente una coda Q di lunghezza N che può crescere fino a M. Per le prime inserzioni M, N cresce da zero fino a raggiungere M; successivamente, ogni inserimento fa sballare un oggetto dall'altra parte, in modo che N non superi mai M.

  • Lascia che ci sia un totale parziale T inizializzato a 0.

  • Ogni volta che viene inserito l'elemento I (che può causare il lancio dell'elemento X):

    • Aggiungi il valore di I a T.
    • Se N == M (ovvero, X viene lanciato) quindi Sottrarre il valore di X da T.
    • La nuova media è T / N.

Quindi, la media corrente può essere calcolata senza rivisitare tutti i valori nella coda, cioè in O (1) invece di O (N).

    
risposta data 14.02.2015 - 23:22
fonte
0

Nel caso I = 0 (dall'inizio), il modo più veloce per calcolare i valori medi è in questo modo. Dovresti quantizzare i tuoi dati in intervalli con valori discreti come

  • 0 ms-1 ms = 1
  • 1 ms-2 ms = 2
  • ...
  • 40 ms-50 ms = k
  • 50 ms-70 ms = k + 1
  • ...
  • > 5000ms = n (anche per non aver mai risposto)

Quanto più improbabile è il valore di latenza misurato nel mondo reale, tanto più ampio dovrebbe essere l'intervallo. L'inserimento di un valore di latenza in questa mappa è il seguente:

  • discreteLatencyCount [indexForDiscreteLatency (measuredLatency)] ++;

La latenza media viene quindi calcolata da:

  • avg = 0.0
  • for (i = 1 a n) {avg + = weightOfDiscreteLatencyFor [i] * discreteLatencyCount [i]; }

  • weightOfDiscreteLatencyFor [] è per soluzioni semplici a metà dell'intervallo o dipende dalla distribuzione delle statistiche - Prova a registrare un set di dati abbastanza grande e ad accordare i valori per ridurre al minimo la vera differenza per questo set di dati.

Il conteggio dei messaggi viene quindi calcolato da:  * count = 0;  * for (i = 1 a n) {count + = discreteLatencyCount [i]; }

lavorare con finestre a scorrimento fisso funziona come questo, ma devi sottrarre gli eventi in uscita (che stanno lasciando la finestra scorrevole) dai tuoi contatori. Questa implementazione è una buona soluzione, se hai bisogno di un calcolo veloce (o costante) di avg e count.

Ma dipende dal tuo caso se questa soluzione è abbastanza buona per te. Invece, potresti utilizzare anche soluzioni pronte come un database round robin. Si prega inoltre di considerare i problemi di blocco negli ambienti multithread.

Sono arrivato a questa soluzione dopo che un collega del settore telco mi ha preso in giro con questa domanda qualche anno fa e poi mi ha detto che lo hanno implementato in questo modo, dopo aver presentato questa soluzione.

    
risposta data 14.02.2015 - 18:47
fonte

Leggi altre domande sui tag