Sto implementando un server personalizzato che deve mantenere un numero molto elevato (100K o più) di connessioni longeve. Il server passa semplicemente i messaggi tra i socket e non esegue alcuna elaborazione seria dei dati. I messaggi sono piccoli, ma molti di questi vengono ricevuti/inviati ogni secondo. Ridurre la latenza è uno degli obiettivi. Mi rendo conto che l'utilizzo di più core non migliorerà le prestazioni e quindi ho deciso di eseguire il server in una singola discussione chiamando i metodi run_one
o poll
dell'oggetto io_service
. In ogni caso, il server multi-thread sarebbe molto più difficile da implementare.Prestazioni a singolo filetto Asio Boost
Quali sono i possibili colli di bottiglia? Syscalls, larghezza di banda, completamento della coda/evento di demultiplexing? Ho il sospetto che i gestori di dispacciamento possano richiedere il blocco (fatto internamente dalla libreria asio). È possibile disabilitare anche il blocco della coda (o qualsiasi altro blocco) in boost.asio?
MODIFICA: domanda correlata. Le prestazioni di syscall migliorano con più thread? La mia sensazione è che siccome i syscalls sono atomici/sincronizzati dal kernel, l'aggiunta di più thread non migliorerà la velocità.
Se si sta eseguendo tutto in un thread, non è necessario alcun blocco (scritto a mano). –
L'utilizzo di più core probabilmente migliorerà le prestazioni - vedere http://cmeerw.org/blog/748.html#748 e http://cmeerw.org/blog/746.html#746 per alcuni benchmark che ho fatto l'anno scorso. – cmeerw