One Large JVM vs. Multiple Smaller JVMs

Based on the latest JVM technology (J2SE 5 or higher), hardware and Application Server implementations (e.g. WebLogic 9.x or WebSphere 6.x), which of the following two configurations is better on a multiple-CPU UNIX machine:
1. One large JVM with 2-4 GB heap size and 200+ threads for a single Application Server instance.
2. Two or more smaller JVMs, each with < 1 GB heap size and < 100 threads for an Application Server cluster of multiple application server instances

What are the major pros and cons of each solution?

nbkd72eAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
Mayank SConnect With a Mentor Associate Director - Product EngineeringCommented:
I prefer an application server cluster so that if one process fails by any chance, the system is still reliable.
0
 
ksivananthCommented:
when you increase the heap, the max no. of threads get decreased!

I have read some ehere that 1GB is good trade off!

More instances can share the load and the possibility of crash is less and possible to have failover mech.

0
 
Ajay-SinghCommented:
> when you increase the heap, the max no. of threads get decreased!
can you pls explain little more? i thought the max no of *active* theads depends on no of CPUs of the box.
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
ksivananthCommented:
>>can you pls explain little more?

for e.g.,

heap         #of threads allowed

-Xmx128m    7500
-Xmx1024m  2500
0
 
ksivananthCommented:
>>i thought the max no of *active* theads depends on no of CPUs of the box.

though I have not tested this, I don't think so!
0
 
Ajay-SinghCommented:
GC works better on larger heap JVMs than smaller ones. The GC tuning option "-XX:+UseParallelGC" highly depends on the no of CPU available on the box. It would run efficiently if only one JVM is running.

Have a look to various GC options:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
0
 
nbkd72eAuthor Commented:
I really want to hear from people who has done load test and application server performance tuning against those two scenarios, especially the experiences of tuning a high-profile production system.
0
 
nbkd72eAuthor Commented:
I was told by some application server vendor consultants a few years back that the second approach would perform better. But I am not sure if that principal is still valid based on the latest JVM, hardware and App Server technologies.

I think it worth to specify my concerns of the single large JVM approach (the first one):

    1) GC - How efficiently the JVM can handle 2-4 GB heap size without causing performance penalties. Do you think having multiple JVMs each handles GC more a smaller heap will be more efficient?

    2) Managing threads - 1000 threads per Java process vs. 200-300 threads per Java process (with 4 Java processes on the same machine), would the second case managing Java threads more efficiently, including thread scheduling, handling Java synchronization (or managing the locks/mutexes/monitors) ?

    3) As somebody already mentioned, the availability and reliability. Having to deal with something extremely large always challenges the underneath technology or implementation, and potentially need more time to get mature.
0
 
Ajay-SinghConnect With a Mentor Commented:
1) GC runs better on larger heaps. So, multiple JVMs with smaller heap would degrade the performance.
2) The number 1000 is pretty huge if you talk about no of threads you should configure your application with. You really need much more cpu to handle it. At a given moment the number of active threads active (on the cpu) would be no of CPUs. Because of IO wait and other waits on the application you can spawn more threads than no of cpus on the box, but the thread no 1000 is really big.
3) If you want to run multiple instances of same JVM on the single box for more availability - its really bad design. If the box goes down for some catastrophic failure, everything would blackout.
0
 
ksivananthConnect With a Mentor Commented:
>>If you want to run multiple instances of same JVM on the single box for more availability - its really bad design. If the box goes down for some catastrophic failure, everything would blackout.

Not exactly, there is no rule that you have to run in single system, we don't expect the cluster running in single system.

>>GC runs better on larger heaps. So, multiple JVMs with smaller heap would degrade the performance.

We design the application not for GC, its for app performance! Of course, heap spec is at runtime. It is not controled by either of the design. I feel, it is to decide if multi node or single node!

The reason for multinode is load balancing and failover.

With single node approach, the two is not possible. Even if you vconfigure single node with high config 2GB... what will you do if the app recieves more load than this config?

and the other factor is that the effort you can invest. Of course, single node approach needs lesser effort than multi.
0
 
Ajay-SinghCommented:
ksivananth,

I agree we don't design system for GC, but we definitely design system for better performance, and then tune with GC for low pause timings.
0
 
Ajay-SinghCommented:
> With single node approach, the two is not possible.
1 or 2 - its single point of failure.

> Even if you vconfigure single node with high config 2GB... what will you do if the app recieves more load than this config?
You really need very very powerful box or your server is doing nothing (kind of ping server)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.