Please find below my thoughts to the discussions on this article and also on offline queries received by me on my email...
1. Experiments were done with without EJB's too. Following were some of the experiments:
a. Plain JSP's
b. JSP's - DAO - Database
c. JSP's - Session Bean - DAO - Database
Results found were similar to the one's in the article. The application server became a bottleneck much before the hardware resources were fully utilized.
2. Little's Law Validation
Littles Law states that:
Number of Users pumped in the load testing tool = Throughput (Response Time + Think Time)
If the L.H.S is equal to the R.H.S then the test is ok. This is a good law to verify that the load testing equipment is not a bottleneck.
There can be times when the load testing tool does not fire the load input by the user. For example if one inputs a 1000 user load and for some reason the load testing tool can only fire 100 users (however it will display 1000 users) , then the L.H.S in the above equation would never be equal to the R.H.S and this would indicate a bottleneck in the load testing tool.
L.H.S = No. Of Users = 1000
R.H.S would be the product of the throughput and response time and will be approximately equal to 100.
L.H.S is not equal to R.H.S
3. Load Balancing
The trick used to ensure that the load balancing does not add an overhead to the test was as follows:
Two client machines were used to fire up the load. In the load testing script the dns name was used (For example www.infosys.com). Then the host file in the two machines were changed to ensure that the dns name 'www.infosys.com'pointed to two different ip address.
In the first client machine www.infosys.com pointed to 172.25.203.149
In the second client machine www.infosys.com pointed to 172.25.203.148
And in the load testing tool the load to be fired by these two machines was given to be equal.
This ensured that the load received by the two instances was equal and it did not require an actual load balancing setup. However this might not be possible in an actual production environment.
4. Service Demand.
Service Demand = Utilization divided by the throughput.
Thus service demand is the utilization of an resource per transaction.
i.e.. Application Server Service Demand = Application Server Utilization divided by Throughput
Database Server Service Demand = Database Server Utilization divided by Throughput
Normaly the service demand should remain more or less the same with increasing load. This ensures that the environment is scaling pretty well. However if the service demand increases, this indicated that the environment is not tuned and hence is not scaling up and hence indicates an bottleneck in the environment.