Domanda

Sto usando RRDTool ( http://oss.oetiker.ch/rrdtool/ ) come back-end grafico per l'archiviazione delle metriche delle prestazioni. Questo viene fatto tramite l'interfaccia della riga di comando di RRDTool da uno script Python.

Il mio problema è che lo script è multithread e ogni thread aggiorna RRD a un ritmo piuttosto rapido. A volte un aggiornamento fallisce perché un thread sta accedendo al file RRD mentre anche un altro tenta di accedervi.

Ho avuto l'impressione che sia OK provare poiché RRDTool utilizza il proprio meccanismo di blocco, ma immagino che non sia vero.

Qualcuno ha un buon approccio per l'accesso simultaneo a un RRD?

Posso pensare ad alcuni modi per andare:

  1. hanno 1 thread per creare una coda e alimentare l'RRD da un singolo thread.

  2. crea il mio meccanismo di blocco all'interno dello script Python. (come lo farei?)

hai ottenuto qualcosa di meglio o hai riscontrato questo problema prima?

È stato utile?

Soluzione

Un blocco esclusivo dovrebbe essere sufficiente per questo problema:

Definisci il tuo oggetto lock a livello principale, non a livello di thread, e il gioco è fatto.

Modifica in risposta al commento:

se definisci il tuo blocco ( lock = new Lock () ) a livello di thread, avrai un oggetto lock per thread in esecuzione e vuoi davvero un singolo lock per gli aggiornamenti del file rrdtool , quindi questa definizione deve essere al livello principale.

Altri suggerimenti

Puoi anche provare a utilizzare rrdcached per eseguire gli aggiornamenti. Quindi tutti gli aggiornamenti di scrittura verranno serializzati tramite rrdcached. Quando si desidera leggere il RRD per generare grafici, si dice al demone di scaricarlo e il RRD su disco rappresenterà quindi lo stato più recente.

Tutti gli strumenti RRD lo faranno in modo trasparente se puntati sul demone memorizzato nella cache tramite una variabile di ambiente.

Questa discussione in rrd- l'elenco degli utenti può essere utile. L'autore di rrdtool afferma che il suo blocco dei file gestisce letture e scritture simultanee.

Suggerirei di usare rrdcached , che migliorerà anche le prestazioni del tuo raccoglitore di dati. Le ultime versioni di rrdtool (1.4.x) hanno notevolmente migliorato la funzionalità e le prestazioni di rrdcached ; puoi ottimizzare anche il comportamento della cache in base ai tuoi dati per ottimizzare.

Facciamo un forte uso di rrdcache qui con diverse centinaia di aggiornamenti al secondo su un gran numero di file RRD.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top