My goal was to test how scalable is ADF framework classical stack and if it can run for longer periods of time under constant runtime access. Experiment results - yes, ADF is scalable framework. There are people who complain about ADF performance, please leave your comment if you are not happy with ADF - this post is dedicated to you. But before leaving your comment - please think about house construction process. Even when using good quality tools and materials, still there is no guarantee that materials will be assembled correctly and house construction result will be as expected. What I mean is - ADF application performance depends a lot how you are building your application, if you are following ADF best practices. Would you hire builders to build your house without previous house construction experience? Think same about ADF - would you hire developers without ADF experience to build ADF application? Yes, it happens quite often - people are building ADF applications without ADF experience. However, they tend to forget this fact, because its easier to blame framework at the end.
I was running performance test with standard Oracle ADF sample application - Oracle Fusion Order Demo Application For JDeveloper 11.1.1.5. Performance test was executed with JMeter, download test script - AMTest_Long.jmx.
ADF BC was configured to support 50 concurrent users (Referenced Pool Size = 50), but stress test was executed with 200 users to show ADF scalability with larger number of users.
Performance test details:
- Duration: 22 hours
- Online concurrent users: 200
- Action frequency per user: ~20 requests, break for 1 minute after each 20 requests
- ADF Framework: 11g PS4, ADF BC, ADF Task Flows, ADF Faces
- ADF BC Tuning: Referenced Pool Size = 50, Database Pooling enabled, DB Passivation disabled
- Hardware: 7 GB RAM, 4 Processors
- JVM tuning: Sun JVM defaults
During this stress test each user selects different items and then is browsing shopping cart details:
In order to run long stress test, start JMeter in command line mode (otherwise JMeter will get out of memory exception after hour or so). jmeter -n -t jmeter_script:
Stress test was started around 4 PM, January 13th:
- Active sessions: 200
- Request processing time: 70 ms (0.07 second)
- Requests per minute: ~600
- AM active instances: 50
- AM passivations per minute: ~200 (this allows to support larger number of users, than configured by Referenced Pool Size)
There are 50 Active AM instances, but only 4 DB connections are used as maximum:
In order to minimize DB connections usage, I have enabled DB pooling and set to store passivation data in memory instead of using database PS_TXN table, based on my previous tests - Stress Testing Oracle ADF BC Applications - Do Connection Pooling and TXN Disconnect Level.
Stress test was finished around 2 PM, January 14th:
- Active sessions: 200
- Request processing time: 100 ms (0.1 second, increased because different set of requests applied)
- Requests per minute: ~600
- AM active instances: 50
- AM passivations per minute: ~200
This shows almost no change in ADF application runtime performance, even after 22 hours of continuos runtime access - good news.
There was no change in DB connections usage - it stays low:
There are no warnings in WebLogic status:
FOD application module settings were tuned to support only 50 concurrent users, but it was working well with 200:
DB connection pooling was enabled along with virtual memory for passivation:
JMeter script was configured with 200 online users:
Two main loop controllers were defined, first loop controller triggers 50 loops for ~20 requests with wait time of 1 minute after all requests are executed from current iteration:
Second loop controller runs forever, this allows to execute really long ADF application stress test:
I was running performance test with standard Oracle ADF sample application - Oracle Fusion Order Demo Application For JDeveloper 11.1.1.5. Performance test was executed with JMeter, download test script - AMTest_Long.jmx.
ADF BC was configured to support 50 concurrent users (Referenced Pool Size = 50), but stress test was executed with 200 users to show ADF scalability with larger number of users.
Performance test details:
- Duration: 22 hours
- Online concurrent users: 200
- Action frequency per user: ~20 requests, break for 1 minute after each 20 requests
- ADF Framework: 11g PS4, ADF BC, ADF Task Flows, ADF Faces
- ADF BC Tuning: Referenced Pool Size = 50, Database Pooling enabled, DB Passivation disabled
- Hardware: 7 GB RAM, 4 Processors
- JVM tuning: Sun JVM defaults
During this stress test each user selects different items and then is browsing shopping cart details:
In order to run long stress test, start JMeter in command line mode (otherwise JMeter will get out of memory exception after hour or so). jmeter -n -t jmeter_script:
Stress test was started around 4 PM, January 13th:
- Active sessions: 200
- Request processing time: 70 ms (0.07 second)
- Requests per minute: ~600
- AM active instances: 50
- AM passivations per minute: ~200 (this allows to support larger number of users, than configured by Referenced Pool Size)
There are 50 Active AM instances, but only 4 DB connections are used as maximum:
In order to minimize DB connections usage, I have enabled DB pooling and set to store passivation data in memory instead of using database PS_TXN table, based on my previous tests - Stress Testing Oracle ADF BC Applications - Do Connection Pooling and TXN Disconnect Level.
Stress test was finished around 2 PM, January 14th:
- Active sessions: 200
- Request processing time: 100 ms (0.1 second, increased because different set of requests applied)
- Requests per minute: ~600
- AM active instances: 50
- AM passivations per minute: ~200
This shows almost no change in ADF application runtime performance, even after 22 hours of continuos runtime access - good news.
There was no change in DB connections usage - it stays low:
There are no warnings in WebLogic status:
FOD application module settings were tuned to support only 50 concurrent users, but it was working well with 200:
DB connection pooling was enabled along with virtual memory for passivation:
JMeter script was configured with 200 online users:
Two main loop controllers were defined, first loop controller triggers 50 loops for ~20 requests with wait time of 1 minute after all requests are executed from current iteration:
Second loop controller runs forever, this allows to execute really long ADF application stress test:












6 comments:
Amazing results, Good job Andrejus as usual :)
Thank you for posting this! I was going to do exactly the same (FOD + JMeter) to test our Exalogic machine and to compare benefits of using Exalogic optimizations with non-Exalogic optimized scenario on the same servers. So if you don't mind I'll use you scripts as a starting point :)
Sure, please let us know about results. Interesting what is the impact of using Exalogic for ADF performance.
Regards,
Andrejus
Andrejus, really appreciating your result. Can you share the FOD AM level changes you had done.
Hi,
AM changes are described in the blog, check screenshot #8 and #9.
Also please refer to this post - http://andrejusb.blogspot.com/2011/11/stress-testing-oracle-adf-bc_16.html
Thanks,
Andrejus
Post a Comment