tag:blogger.com,1999:blog-5874979429188093780.post7787154157669211405..comments2024-03-18T06:46:54.352+01:00Comments on Andrej Baranovskij Blog: ADF Task Flow Performance Boost with JET UI Shell WrapperAndrej Baranovskijhttp://www.blogger.com/profile/04468230464412457426noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-5874979429188093780.post-44657753349135782352018-10-26T17:07:40.383+02:002018-10-26T17:07:40.383+02:00Thats for WLS cluster of course. Normally we set u...Thats for WLS cluster of course. Normally we set up to 6 GB heap size per managed server.<br /><br />I dont have list of JVM params, not administering the environment.<br /><br />AndrejusAndrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-7168367938307342142018-10-26T12:22:30.856+02:002018-10-26T12:22:30.856+02:00I am sent you mail.
Just to verify - 392 GB RAM f...I am sent you mail.<br /><br />Just to verify - 392 GB RAM for one WL instance?<br />What is JVM memory arguments?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-24702276948957800992018-10-25T19:24:55.960+02:002018-10-25T19:24:55.960+02:00This machine is dedicated for WebLogic only.
Audi...This machine is dedicated for WebLogic only.<br /><br />Audit tool info - http://andrejusb.blogspot.com/search/label/Extensions, customer feedback - http://www.redsamuraiconsulting.com/audit.html<br /><br />Keep in mind - we dont sell this tool, but give away for free (including source code). But we don't allow public download. To get it, you should send email to me, describe in more detail your ADF implementation and we give URL to download.<br /><br />AndrejusAndrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-34983488067255189342018-10-25T18:06:47.577+02:002018-10-25T18:06:47.577+02:00And that machine serves both database/WebLogic, or...And that machine serves both database/WebLogic, or WebLogic only?<br />I am trying to compare with our hardware resources...<br /><br /><br />Is there any website related to your audit tool?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-44810292673019520372018-10-25T16:50:33.743+02:002018-10-25T16:50:33.743+02:00Ok, so there is no passivation/activation really.
...Ok, so there is no passivation/activation really.<br /><br />Example for strong hardware from one of the projects - Dell PowerEdge R730, 2 CPU sockets, Intel Xeon E5-2667 v3 at 3.2 GHz, 8 cores per socket, 392 GB memory<br /><br />Let me know if further help will be required. We could share our ADF runtime performance audit tool, which logs system runtime metrics specific to ADF and this helps to tune problematic system areas.<br /><br />AndrejusAndrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-47011984470015334732018-10-25T08:15:43.788+02:002018-10-25T08:15:43.788+02:00Hi Andrejus,
Thanks for the help offer, but every...Hi Andrejus,<br /><br />Thanks for the help offer, but everything is fine with our app.<br />Simply, there is multiple passivateState() methods in the ApplicationModuleImpl.<br />The first one<br /><br />public int passivateState(int id, byte[] clientData, int flags)<br /><br /> which framework call at the end of _every request, and second one, <br /><br />protected void passivateState(Document aDocument, Element aElement)<br /><br /> which framework calls only if AM passivation really happens.<br /><br />So, when I override the second one, I notice that real passivation never happens in standalone WebLogic<br /><br />Thanks for all again.<br /><br />P.S. can you tell me now, what is "strong hardware" means in order to serve 500 concurent users? ;-)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-72430822898049856482018-10-25T06:37:46.947+02:002018-10-25T06:37:46.947+02:00Juan, thanks for your questions.
Answers:
1. If ...Juan, thanks for your questions.<br /><br />Answers:<br /><br />1. If you want to handle dirty state, when closing JET tab - you could call JS method located in ADF frame from JS wrapper. This method could check for dirty changes and prevent tab from closing, if there are any dirty changes<br /><br />2. TF's are not finalized when closed, even when they are loaded in ADF UI Shell. If you want to finalize, also could follow JS call approach on tab close from JET wrapper. This JS call would invoke ADF server listener, and you do finalize logic there<br /><br />AndrejusAndrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-13753456831329551782018-10-25T06:30:16.496+02:002018-10-25T06:30:16.496+02:00Anonymous, something is messed up in your code. If...Anonymous, something is messed up in your code. If you get passivation/activation while running on integrated server with single session, something is really really bad in the app.<br /><br />This would required code debugging, to answer what is wrong exactly. But I'm sure - tuning alone would not help, until code is not fixed.<br /><br />I'm willing to help you, if you want please get in touch by email and we could have a call on Skype to debug it.<br /><br />AndrejusAndrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-52832724650055400492018-10-24T16:34:19.456+02:002018-10-24T16:34:19.456+02:00This approach improves performance and user experi...This approach improves performance and user experience, but i have a couple of questions as i have no time to test them.<br /><br />How to handle dirty states, as you can not handle that from JET (in order to warn the user).<br />Perhaps you have to deal with iframes unloading, in order to use a beforeunload event of ADF side (or perhaps your code can already fires that event).<br />I don't know if beforeunload event of ADF side will be executed, and the event of the JET iframe component can not detect any ADF dirty state.<br /><br />If TFs are URL invoked and you can close the tabs from JET, then the TFs are not finalized when using application, so this approach increases the number of "zombie pageFlow scopes" that will die when session expires.<br />Enough memory would avoid any problem, but i wonder if this cloud be handled some way.<br /><br />Thanks.Juan Sáenz de Juberanoreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-53615515784599792302018-10-24T13:45:08.056+02:002018-10-24T13:45:08.056+02:00And I just call Thread.dumpStack() in the override...And I just call Thread.dumpStack() in the overriden passivateState(), in order to see what actually causes AM passivation.<br /><br />Interesting, looks like at end of each request, the SessionCookieImpl calls releaseApplicaiotnModule(), which then causes passivateState()<br /><br />Can you comment something on this?<br /><br /><br /> at oracle.jbo.server.ApplicationPoolMessageHandler.doPoolMessage(ApplicationPoolMessageHandler.java:396)<br /> at oracle.jbo.server.ApplicationModuleImpl.doPoolMessage(ApplicationModuleImpl.java:9958)<br /> at oracle.jbo.common.ampool.ApplicationPoolImpl.sendPoolMessage(ApplicationPoolImpl.java:4614)<br /> at oracle.jbo.common.ampool.ApplicationPoolImpl.doManagedCheckin(ApplicationPoolImpl.java:2787)<br /> at oracle.jbo.common.ampool.ApplicationPoolImpl.releaseApplicationModule(ApplicationPoolImpl.java:1547)<br /> at oracle.jbo.common.ampool.SessionCookieImpl.releaseApplicationModule(SessionCookieImpl.java:858)<br /> at oracle.jbo.common.ampool.SessionCookieImpl.releaseApplicationModule(SessionCookieImpl.java:778)<br /> at oracle.adf.model.bc4j.DCJboDataControl.releaseApplicationModule(DCJboDataControl.java:2645)<br /> at oracle.adf.model.bc4j.DCJboDataControl.endRequest(DCJboDataControl.java:2292)<br /> at oracle.adf.model.dcframe.DataControlFrameImpl.endRequestInternal(DataControlFrameImpl.java:859)<br /> at oracle.adf.model.dcframe.DataControlFrameImpl.endRequest(DataControlFrameImpl.java:727)<br /> at oracle.adf.model.BindingContext.endRequest(BindingContext.java:2583)<br /> at oracle.adf.model.BindingRequestHandler.invokeEndRequest(BindingRequestHandler.java:476)<br /> at oracle.adf.model.BindingRequestHandler.endRequest(BindingRequestHandler.java:345)<br />Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-14205225372040367682018-10-24T08:15:25.624+02:002018-10-24T08:15:25.624+02:00I would set Minimum Pool Size to 0 and increase Id...I would set Minimum Pool Size to 0 and increase Idle Instance Timeout to be more than web session timeout.<br /><br />But, if you still have passivation/activation, means app code is written badly and only tuning would not help. Normally if Referenced Pool Size is set to be more than number of sessions, there should be no passivation/activation.<br /><br />In your case if you see passivations/activations even on integrated server, no hardware will help :)<br /><br />Andrejus<br /><br />Andrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-57388858608815415992018-10-24T07:54:07.334+02:002018-10-24T07:54:07.334+02:00Thanks for valuable response
Last questions:
For ...Thanks for valuable response<br />Last questions:<br /><br />For our app, we are tune those settings:<br /><br />Initial pool size : 160<br />Minimum available size: 160<br />Maximum available size: 200<br />Referenced pool size: 200 <br />Idle instance timeout (= session timeout from web.xml): 7200<br /><br />jbo.ampool.timetolive: -1<br />jbo.doconnectionpooling: true<br />jbo.txn.disconnect_level = 1<br />Enable application module pooling: yes<br /><br />Yet, when running app in integrated WebLogic, (module that just display data from one DB table in read-only mode) we noticed that framework calls ApplicationModuleImpl.passivateState(), very often. <br /><br />Is not that pretty unusual?<br /><br />@" If application is well tuned, and server hardware is strong - typically it can run 500 concurrent users per each managed server node."<br /><br />-Can you specify more precise what "strong hardware" in your case means?<br />Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-4019837404733289292018-10-23T18:38:39.042+02:002018-10-23T18:38:39.042+02:00Well, this is how framework works behind the scene...Well, this is how framework works behind the scenes. Whatever resource user keeps active at the moment, as AM's - these resources are revisited during request. This means AMs from open tabs (the ones which are open, but not disclosed too) - will be 'touched' and DB connection will be established and released instantly. Based on our tests, if user opens 10 tabs with ADF TF's, delay for request processing could be around 1 second. But if same app is deployed on powerful server, delay for this functionality drops to 0.25 second. So, it really depends on server side processing power.<br /><br />Regarding your question: yes we have both Oracle UI Shell and custom ADF UI Shell apps in production. Typically we allow to open up to 10 tabs with ADF Isolated TFs. If application is well tuned, and server hardware is strong - typically it can run 500 concurrent users per each managed server node. This means if you need to support 2000 concurrent users, would need to have 4 nodes.<br /><br />100 concurrent users is not much for ADF, this number should be handled easily if app is properly tuned. I would recommend to set Referenced Pool Size to be larger than estimated number of users, to avoid passivation/activation. Key tuning point - try to avoid passivations/activations, since passivation/activation is main slowdown for ADF runtime performance. Check my previous post: http://andrejusb.blogspot.com/2013/12/how-to-minimize-number-of-adf-bc.htmlAndrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-73058554298651442112018-10-23T07:37:48.336+02:002018-10-23T07:37:48.336+02:00This is a really bad.
One question: do you have s...This is a really bad.<br /><br />One question: do you have some experience with complex ADF UI Shell applications in production? For example, with max 6 opened tabs, each having Isolated taskFlow inside. I know it depends of application, but many simultaneous users such one application can support?<br /><br />Also I am interested in AM pooling params.<br />We have just one app module. <br />In order to support 100 sim. users, what should be value of Referenced pool size?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-66915762645182735982018-10-22T21:48:14.925+02:002018-10-22T21:48:14.925+02:00This is how ADF server side works, it needs to pro...This is how ADF server side works, it needs to process all open resources during request, even some of the resources are not really used. This was one of the main reasons, why I created JET UI Shell wrapper - to avoid this behaviour.<br /><br />Regards,<br />AndrejusAndrej Baranovskijhttps://www.blogger.com/profile/04468230464412457426noreply@blogger.comtag:blogger.com,1999:blog-5874979429188093780.post-29001973866955708922018-10-22T19:25:15.831+02:002018-10-22T19:25:15.831+02:00@"There is more to this - even if tab in ADF ...@"There is more to this - even if tab in ADF is not currently active (tab is disclosed), tab content (e.g. region rendered from ADF Task Flow) still may participate in the request processing."<br /><br />- I noticed exactly the same!<br />Why is so, and have you idea on how to avoid this strange behavior?Anonymousnoreply@blogger.com