2011-06-09 25 views
5

Sto eseguendo alcuni test delle prestazioni per determinare i tempi di risposta e la capacità di gestire la concorrenza con varie configurazioni di cpu/ram/os. Una scoperta interessante in cui mi sono imbattuto, è che sembra che una singola jvm funzioni meglio con 4 core rispetto a 2 core (non c'è da stupirsi), ma l'aggiunta di più core oltre il 4 core non comporta miglioramenti significativi . Ma poi, l'aggiunta di un'altra istanza di jvm con un bilanciamento del carico (stesso hardware) ha comportato un notevole miglioramento.Quanti core cpu possono utilizzare un singolo processo Java?

Sembra che un singolo processo sia limitato dal numero di core che può utilizzare, forse a causa di una limitazione del numero di thread os che un processo può generare in un momento. Questo è un ambiente a 64 bit.

Im utilizzando tomcat e provato a modificare l'attributo "maxThreads" ma ciò non ha fatto la differenza per la quantità di concorrenza che sto cercando di gestire.

Qualsiasi altra ragione potrebbe essere spiegata?

+1

"Dipende da cosa sta sfruttando la valuta e come"? (Oppure c'è un problema più radicato come solo essere in grado di generare thread su 4 core? Qualche affinità?) –

+0

Quale JVM stai usando? Sembra improbabile che ci sarebbe una limitazione sul numero di core che potrebbero essere utilizzati. –

+0

Forse sei legato a qualcos'altro, ma pura CPU, ad es. un pool di database. O le sessioni utente di tomcat. – nos

risposta

2

In generale, un'applicazione Java proverà a pianificare ogni thread attivo su un core separato. Questo include i thread GC. Se l'applicazione non era legata alla CPU, in primo luogo, l'aggiunta di più core non avrebbe alcuna importanza in quanto i thread sono bloccati da qualcosa.

Per un'applicazione Web, le cose si complicano leggermente. Aumentare la dimensione del pool di thread non farà alcuna differenza se c'è qualcos'altro che i thread sono in attesa, come un database da un pool di connessioni di database, per esempio. È necessario esaminare attentamente il bilanciamento del carico e le configurazioni di Tomcat. Se quelli non sono sintonizzati correttamente è molto facile avere il comportamento che descrivi.

Non mi preoccuperei troppo di JVM essendo limitato nel numero di thread che può avere. Vedo regolarmente oltre 600 thread in ogni JVM nel nostro sistema di produzione. Utilizziamo 8 core machine e le richieste sono di breve durata, quindi la maggior parte di questi thread si trova in uno stato di attesa I/O.

+0

"un'applicazione Java proverà a programmare ogni thread attivo su un core separato" ... JVMs non pianificare i thread, lo scheduler del SO decide quali thread ottengono la cpu e su quali core vengono eseguiti. – Matt

+0

Vero, l'I/O potrebbe essere un collo di bottiglia (anche se non è nel mio caso). Il mio esperimento indica che due processi java sono in grado di utilizzare un pezzo di hardware in modo più efficace di un singolo processo sullo stesso hardware. Sono curioso di sapere se c'è da aspettarselo e se è dovuto alle limitazioni poste dal sistema operativo su quanto tempo può essere dato un singolo processo. – Kailash

+0

@Matt Vero se stai usando i thread nativi (che dovresti essere!). Non necessariamente se stai usando fili verdi. http://en.wikipedia.org/wiki/Green_threads –

Problemi correlati