Gli agenti basati su thread di Clojure gestiscono le prestazioni di c10k?

5

Sto scrivendo un servizio c10k e sto cercando di valutare le prestazioni di Clojure. Gli agenti Clojure possono gestire questa scala di concorrenza con i suoi agenti basati su thread? Altri sistemi ad alte prestazioni sembrano muoversi verso asincrono-IO / eventi / greenlet, sebbene con un costo apparentemente più elevato di complessità.

Supponiamo che ci siano 10.000 client connessi, che inviano messaggi che dovrebbero essere aggiunti a 1.000 file locali - il servizio Clojure sta provando a scrivere su più file in parallelo che può, mentre non consente a nessuna delle due richieste separate di manipolare lo stesso singolo file scrivendo allo stesso tempo.

Clojure agenti sono estremamente eleganti concettualmente: consentirebbero la scrittura separata di file separati in modo asincrono, mentre serializzazione (nel senso del database) richieste multiple per scrivere sullo stesso file.

La mia comprensione è che gli agenti lavorano avviando un thread per ogni operazione (supponiamo di essere legati all'IO e usando send-off ) - quindi in questo caso è corretto che inizierebbe 1000+ thread? I sistemi attuali possono gestire questo numero di thread in modo efficiente? La maggior parte di loro dovrebbe essere legata all'IO e dormire la maggior parte del tempo, ma presumo che ci sia ancora una penalità di commutazione del contesto che è teoricamente più alta dei sistemi asincroni-IO / eventi (es. Erlang, Go, node.js) .

Se la soluzione Clojure può gestire le prestazioni, sembra la cosa più elegante da codificare. Tuttavia, se non è in grado di gestire le prestazioni, potrebbe essere preferibile qualcosa come i processi leggeri di Erlang o di Go, dal momento che sono progettati per aver generato decine di migliaia di file contemporaneamente e sono solo moderatamente più complessi da implementare.

Qualcuno ha affrontato questo problema in Clojure o rispetto a queste altre piattaforme? (Grazie per i tuoi pensieri!)

    
posta elliot42 17.11.2012 - 13:49
fonte

2 risposte

4
Gli agenti

utilizzano un pool di thread espandibile anziché avviare semplicemente un thread per attività. quindi il numero di thread attivi sarà cc vicino al numero di agenti attivi. 1000 thread mi sembra ragionevole per un computer moderno. probabilmente dovrai aumentare i maxi descrittori di file aperti (presupponendo Linux)

    
risposta data 17.11.2012 - 15:03
fonte
1

A partire dal prossimo Clojure 1.5, puoi usare ExecutorServices personalizzato (fino a set-agent-send-executor! e set-agent-send-off-executor! ).

In questo modo sarai in grado di limitare il numero di thread - se necessario, 1k per lo più thread dormienti non sembra fuori portata per la JVM. Attenzione però alle dimensioni dello stack.

    
risposta data 22.11.2012 - 16:11
fonte

Leggi altre domande sui tag