I recently had to work on a requirement where I had to support (response time less than 5 seconds) for 500 concurrent users, with 10 million users in database and a single server. I tried going through many forums and open source tools, from which I finalized on jMeter for performance testing and jVisualVm for finding bottlenecks.
This was my approach:
- Make sure that the server (hardware can be as per the staging/production requirements) has no other installations that can affect the performance.
- For setting up the users in DB, a procedure can be used and can be called as a part of jmeter test plan.
- Install jmeter on a separate machine, so that jmeter won't affect the performance.
- Create a test plan in jmeter (as shown in the figure 1) for all the uri's, with response checking and timer based requests.
- Take the initial benchmark, using jmeter.
- Check for the low performance uri's. These are the points to expect for bottlenecks.
- Try different options for performance improvement, but focus on only one bottleneck at a time. Some of them can be
- Database index. Use the DB server logging to find the slow queries, use explain plan and improve the sql statements.
- Check the configuration parameters for any third party tools.
- Check if there are any dead locks (can be checked with jVisualVM as shown in Figure 2).
- Profiling the application using jVisualVm(can be checked with jVisualVM as shown in Figure 3).
- Data structures, algorithms and loops.
- UI components, try advices from YSlow. Try streaming, caching, etc.
- Read the hardware configuration and try for any options like cpu cache, jvm tuning, paging, etc. This step does not include hardware scaling.
- Check for memory leaks using jVisualVm.
- Try any one fix from step 6 and then take an benchmark. If there is any improvement commit the changes and repeat from step 5. Otherwise revert and try for any other options from step 6.
- The next step would be to use load balancing, hardware scaling, clustering, etc. This may include some physical setup and hardware/software cost. Give the results with the scalability options.
jMeter test plan
Figure 1: jMeter test plan |
jVisualVM run for a sample deadlock program.
Figure 2: jVisualVM shows Thread 1 and 2 waiting for the monitor |
Figure 3: jVisualVm showing profile results for memory |
Results:
In the end it is better to prepare a complete report from the benchmarks and finally define the performance with details of the hardware, software, maximum db load, maximum number of concurrent users supported(users active every 2 seconds), maximum number of sessions, changes made and the improvement achieved. Any unimplemented changes can be suggested for improvement, so that the effort to find the bottleneck is improved.
No comments:
Post a Comment