È il seguente corretto?Quando utilizzare il pattern di disturbo e quando lo storage locale viene rubato dal lavoro?
- Il disruptor pattern ha prestazioni migliori parallelo e scalabilità se ogni voce deve essere lavorato in diversi modi (io operazioni o annotazioni), dal momento che può essere parallelizzata utilizzando più consumatori senza contesa.
- contrario, work stealing (cioè la memorizzazione voci localmente e rubare voci da altri thread) ha prestazioni migliori parallelo e scalabilità se ogni voce deve essere elaborato in un unico modo unico, poiché la distribuzione disgiuntamente le voci su più thread nel disgregatore il modello causa la contesa.
(ed è il modello distruttore ancora così molto più veloce di altri lockless multi-produttore code multi-consumo (ad esempio from boost) quando più produttori (cioè CAS operations) sono coinvolti?)
mio situazione in dettaglio:
L'elaborazione di una voce può produrre diverse nuove voci, che devono essere elaborate alla fine. Le prestazioni hanno la massima priorità, le voci elaborate nell'ordine FIFO hanno la seconda priorità.
Nell'attuale implementazione, ogni thread utilizza un FIFO locale, dove aggiunge le sue nuove voci. I thread inattivi rubano il lavoro dalla FIFO locale di altri thread. Le dipendenze tra l'elaborazione del thread vengono risolte utilizzando una tabella hash lockless, mechanically sympathetic (CAS in scrittura, con granularità del bucket). Ciò si traduce in una contesa piuttosto bassa ma l'ordine FIFO a volte è rotto.
L'utilizzo del pattern di disturbo garantisce l'ordine FIFO. Ma non distribuire le voci sui thread causa una contesa molto più alta (ad esempio CAS su un cursore di lettura) rispetto a FIFO locali con il furto del lavoro (la velocità effettiva di ogni thread è circa la stessa)?
riferimenti che ho trovato
I test di prestazioni in the standard technical paper on the disruptor (capitolo 5 + 6) non coprono distribuzione del lavoro disgiunto.
https://groups.google.com/forum/?fromgroups=#!topic/lmax-disruptor/tt3wQthBYd0 è l'unico riferimento che ho trovato su disruptor + work stealing. Dichiara che una coda per thread è notevolmente più lenta se c'è uno stato condiviso, ma non entra nei dettagli o spiega perché. Dubito che questa frase si applica alla mia situazione con:
- stato condiviso risolto con una tabella hash senza chiave;
- distribuire disgiuntamente voci tra i consumatori;
- tranne per il furto del lavoro, ogni thread legge e scrive solo nella coda locale.
Grazie per la risposta. Fare una distinzione basata su alcuni suoni di paradigma è abbastanza buona, sfortunatamente non so quale sia la differenza tra focus del messaggio e focus del task. – DaveFar
Ho progettato una soluzione al mio problema con gli interruttori: un utente annota le voci in (più) disruptor con i loro valori hash, un altro utente le inserisce nella tabella hash locale e annota le voci con un flag sia che siano state in la tabella hash già. Questa soluzione potrebbe essere più veloce, ma non scala in modo lineare nel numero di thread, come fa la tabella hash lockless.Un ulteriore distruttore, implementando la FIFO per tutti gli elementi appena creati, ha più produttori, quindi non sono sicuro che un disruptor migliori questa parte dell'implementazione. – DaveFar
Btw, i miei compiti sono sicuramente di varia durata, ma l'ordine di elaborazione dei messaggi è un po 'importante ... – DaveFar