2012-04-13 8 views
5

Ho creato un server di messaggi personalizzato in Java che accetta un flusso di messaggi e consegna ogni messaggio al proprio client (1: 1, elimina msg se non connesso - molto semplice). Sto eseguendo Tomcat 7 su Win7x64 & Java 7 e sto utilizzando il connettore NIO (implementato un servlet Comet). Funziona alla grande, ma ora sto cercando di ridimensionare quella bestia e attualmente sto vedendo circa 85kb di RAM allocata per ogni client connesso. 10.000 client @ meno di 900 MB e scalabilità lineare. (Non sto facendo nient'altro se non mantenendo la connessione ancora) Questo è molto secondo me, quindi mi chiedo se ci sono alcune modifiche per far sì che Tomcat o Java risparmino più memoria con i loro impl di NIO. Tutte le impostazioni Tomcat che ho provato finora non hanno avuto alcun effetto su questo.minimizza l'ingombro di memoria "per connessione" di Tomcat

Qualcuno ha esperienza su come mettere Java o Tomcat su una dieta di memoria per quanto riguarda le connessioni socket?

AGGIORNAMENTO: Ora sono inferiore a 70kb/connessione troncando i buffer di socket e alcuni altri interni di tomcat. Non sono sicuro di come questo influenzi ora il throughput. Ho anche provato su linux a 32 bit/64 bit con lo stesso risultato.

+0

Come hai misurato 85kb per client? – dash1e

+0

Ho eseguito un piccolo test di carico e collegato 10.000 client. Nel codice server ho fatto dopo ogni 100 client un System.gc() e poi stampato Runtime.totalMemory() - Runtime.freeMemory() sulla console. – Daniel

+0

Ciao. Puoi condividere le tue migliori impostazioni Tomcat/JVM? Inoltre, hai usato il connettore NIO? 10x – JRun

risposta

1

Dopo un po 'di ricerca e di suonare in giro ho avuto alla conclusione che non è semplicemente possibile con Tomcat per gestire una quantità enorme di connessioni simultanee con ragionevole quantità di memoria. (Sarei ancora felice di essere smentiti qui btw)

Tuttavia, v'è un salvatore:

Netty: http://www.jboss.org/netty/downloads

E 'un framework Java IO che si basa sulla nuova architettura NIO Java e sembra molto ben progettato e scritto È possibile raggruppare alcuni moduli leggeri insieme e creare un mini server Web o semplicemente gestire le connessioni TCP in modo asincrono.

Ho eseguito un test di carico su EC2 e ho raggiunto 7 milioni di connessioni mindblowing @ solo 1,5 GB di RAM! (Come con il test Tomcat ho fatto altro che memorizzare le connessioni, quindi un vero e proprio app sarà ovviamente consumare un po 'più mem, ma 200 byte/connessione "in testa" è niente!) E si è fermato solo lì perché ho limitato la Java VM a 1,5 GB, sono sicuro che un test C10M sarebbe facilmente fattibile.

Grandi complimenti a Netty e ai ragazzi di Java VM! Sono impressionato.

Problemi correlati