Details

    • Type: Task Task
    • Status: Closed Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 2.3.4
    • Fix Version/s: 2.5
    • Component/s: Performance
    • Security Level: Public (Public: Anyone can view)
    • Labels:
      None
    • Similar issues:
      KULRICE-8646Review Performance Issues with OLE's Instance Editor built with KRAD Screens
      KULRICE-10424Research OLE performance on Bibliographic Editor
      KULRICE-8918Improved KRAD collections performance
      KULRICE-13985JPA Performance issues
      KULRICE-14254OLE issue; OJB PersistenceBroker exception: Pool exhausted
      KULRICE-8814KRMS and KRAD Error Map Integration (in OLE)
      KULRICE-9866Performance issue in calculate message totals on client
      KULRICE-9042Spring - Performance
    • Rice Module:
      KRAD
    • KRAD Feature Area:
      UIF Component
    • Application Requirement:
      OLE
    • KAI Review Status:
      Not Required
    • KTI Review Status:
      Not Required
    • Code Review Status:
      Not Required
    • Include in Release Notes?:
      Yes

      Description

      Hi Mark,

      We have a high priority item I was hoping you could put all your focus on (next time you work). It is a performance issue in the OLE project.

      Peri has included links below to the view XML, and a profile snapshot. You can see the main issue is in view copy (when fetching a new view from the dictionary). I suspect there is configuration somewhere causing a very big object graph.

      Other thing to note is they are using 2.3.4, and they need a fix there because they are releasing next week!

      I appreciate any help you can give on this. If you need more information, their lead Peri is copied on this message.

      Thanks!
      Jerry

      From: Peri Subrahmanya peri.subrahmanya@gmail.com
      Sent: Thursday, April 10, 2014 3:27 AM
      To: Jerry Neal
      Cc: ole.dev
      Subject: Fwd: Performance Issues with KRAD screens

      Jerry,

      Correction to the URL for #2 (It appears to be an older file that is not in use anymore);
      It should be https://svn.kuali.org/repos/ole/trunk/ole-app/olefs/src/main/resources/org/kuali/ole/describe/view/WorkBibEditorView.xml

      Thanks
      -PeriS
      ---------- Forwarded message ----------
      From: Peri Subrahmanya <peri.subrahmanya@gmail.com>
      Date: Thu, Apr 10, 2014 at 12:24 PM
      Subject: Performance Issues with KRAD screens
      To: Jerry Neal <jkneal@indiana.edu>
      Cc: "ole.dev" <ole.dev@kuali.org>
      Hi Jerry,

      As discussed, here are links to few of the view.xml files that are taking considerable rendering times. Please let us know.

      1. Marc Editor View - https://svn.kuali.org/repos/ole/trunk/ole-app/olefs/src/main/resources/org/kuali/ole/describe/view/EditorView.xml

      2. https://svn.kuali.org/repos/ole/trunk/ole-app/olefs/src/main/resources/org/kuali/ole/describe/view/MarcEditorView.xml

      3. JProfiler Snapshot

      Thanks
      -PeriS

      1. debug.log
        8.00 MB
        Mark Fyffe
      1. screenshot-1.jpg
        171 kB

        Issue Links

          Activity

          Hide
          Mark Fyffe (Inactive) added a comment -

          I have prepared a small POC against Rice 2.3 that demonstrates how a component override can be used to cut the lifecycle processing time for the empty WorkBibEditorView by 1/3 by removing unused components from the tree. The same approach should prove effective for OLE without much effort.

          For the three file groups targeted by the analysis generated by Rice 2.5 that I posted yesterday, I have redefined the internal group as follows. One Control_Field_006_Section is shown, but 007 and 008 have been modified in a similar fashion.

                          <bean id="Control_Field_006_Section" parent="Uif-VerticalFieldGroup" p:style="font-weight:bold;border:0px;">
          					<property name="group">
          						<bean parent="Uif-VerticalBoxGroup" class="org.kuali.rice.krad.labs.ole.OleControlFieldGroup"
          							p:displayFieldProperty="displayField006" p:fieldLinkId="006FieldLink"
          							p:controlFieldGroupId="Control_Field_006_Data_Section">
          							<property name="validationMessages.displayMessages" value="false" />
          						</bean>
          					</property>
          

          The source for org.kuali.rice.krad.labs.ole.OleControlFieldGroup is below. The purpose of this component override is to inspect the form at the initialize phase, and to prune any components not relevant to the current lifecycle from view processing. This is just an example to illustrate the approach - a solution that is a better fit for OLE, or even a general solution in KRAD, is possible to address similar concerns more thoroughly:

          package org.kuali.rice.krad.labs.ole;
          
          import java.util.Iterator;
          import java.util.List;
          
          import org.apache.log4j.Logger;
          import org.kuali.rice.krad.uif.component.Component;
          import org.kuali.rice.krad.uif.container.Group;
          import org.kuali.rice.krad.uif.util.ObjectPropertyUtils;
          import org.kuali.rice.krad.uif.view.View;
          import org.springframework.util.StringUtils;
          
          public class OleControlFieldGroup extends Group {
          
          	private static final long serialVersionUID = -6929025512918369521L;
          	private static final Logger LOG = Logger
          			.getLogger(OleControlFieldGroup.class);
          
          	private String displayFieldProperty;
          	private String fieldLinkId;
          	private String controlFieldGroupId;
          
          	@Override
          	public void performInitialization(View view, Object form) {
          		super.performInitialization(view, form);
          
          		boolean editable = "true".equals(((LabsOleEditorForm) form).getEditable());
          		boolean displayField = "true".equals(ObjectPropertyUtils.getPropertyValue(form,
          				displayFieldProperty));
          		LOG.info("editable " + editable + " displayField " + displayField);
          
          		List<? extends Component> items = getItems();
          		LOG.info("initialize " + displayFieldProperty + " "
          				+ fieldLinkId + " " + controlFieldGroupId);
          		if (StringUtils.isEmpty(displayFieldProperty)) {
          			LOG.info("skip iterator");
          		} else {
          
          			Iterator<? extends Component> itemIterator = items.iterator();
          			while (itemIterator.hasNext()) {
          				Component component = itemIterator.next();
          				if (component == null) {
          					continue;
          				}
          
          				LOG.info("checking component " + component.getId());
          
          				// @{editable eq 'true' and displayField008 eq 'false'}
          				if (fieldLinkId != null
          						&& fieldLinkId.equals(component.getId())
          						&& (!editable || displayField)) {
          					LOG.info("Omitting " + fieldLinkId + " from lifecycle");
          					itemIterator.remove();
          				}
          
          				// @{editable eq 'true' and displayField008 eq 'true'}
          				if (controlFieldGroupId != null
          						&& controlFieldGroupId.equals(component.getId())
          						&& (!editable || !displayField)) {
          					LOG.info("Omitting " + controlFieldGroupId
          							+ " from lifecycle");
          					itemIterator.remove();
          				}
          			}
          		}
          	}
          
          	public String getDisplayFieldProperty() {
          		return displayFieldProperty;
          	}
          
          	public void setDisplayFieldProperty(String displayFieldProperty) {
          		this.displayFieldProperty = displayFieldProperty;
          	}
          
          	public String getFieldLinkId() {
          		return fieldLinkId;
          	}
          
          	public void setFieldLinkId(String fieldLinkId) {
          		this.fieldLinkId = fieldLinkId;
          	}
          
          	public String getControlFieldGroupId() {
          		return controlFieldGroupId;
          	}
          
          	public void setControlFieldGroupId(String controlFieldGroupId) {
          		this.controlFieldGroupId = controlFieldGroupId;
          	}
          
          	@Override
          	protected <T> void copyProperties(T component) {
          		super.copyProperties(component);
          
          		OleControlFieldGroup copy = (OleControlFieldGroup) component;
          		copy.displayFieldProperty = displayFieldProperty;
          		copy.fieldLinkId = fieldLinkId;
          		copy.controlFieldGroupId = controlFieldGroupId;
          	}
          
          }
          

          Note in the log entries below, that the unneeded components are indeed removed from the group's item list during the initialize phase.

          2014-04-18 07:25:31,302 [http-8080-3] u:admin/d: DEBUG org.kuali.rice.krad.datadictionary.uif.UifDictionaryIndex - View WorkBibE
          ditorView not in cache - creating and storing to cache
          2014-04-18 07:25:33,967 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - performing initial
          ize phase for view: WorkBibEditorView
          2014-04-18 07:25:34,134 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - editable false displa
          yField false
          2014-04-18 07:25:34,137 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - initialize displayFie
          ld006 006FieldLink Control_Field_006_Data_Section
          2014-04-18 07:25:34,137 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 00
          6load
          2014-04-18 07:25:34,137 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 00
          6FieldLink
          2014-04-18 07:25:34,138 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting 006FieldLink
           from lifecycle
          2014-04-18 07:25:34,138 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component Co
          ntrol_Field_006_Data_Section
          2014-04-18 07:25:34,138 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting Control_Fiel
          d_006_Data_Section from lifecycle
          2014-04-18 07:25:34,241 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - editable false displa
          yField false
          2014-04-18 07:25:34,242 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - initialize displayFie
          ld007 007FieldLink Control_Field_007_Data_Section
          2014-04-18 07:25:34,242 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 007load
          2014-04-18 07:25:34,242 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 007FieldLink
          2014-04-18 07:25:34,243 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting 007FieldLink from lifecycle
          2014-04-18 07:25:34,243 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component Control_Field_007_Data_Section
          2014-04-18 07:25:34,243 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting Control_Field_007_Data_Section from lifecycle
          2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - editable false displayField false
          2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - initialize displayField008 008FieldLink Control_Field_008_Data_Section
          2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 008load
          2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 008FieldLink
          2014-04-18 07:25:34,337 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting 008FieldLink from lifecycle
          2014-04-18 07:25:34,337 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component Control_Field_008_Data_Section
          2014-04-18 07:25:34,337 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting Control_Field_008_Data_Section from lifecycle
          2014-04-18 07:25:34,350 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - performing apply model phase for view: WorkBibEditorView
          2014-04-18 07:25:34,473 [http-8080-1] u:/d: INFO  org.kuali.rice.krad.uif.util.ProcessLogger - KRAD Process Trace (request): Servlet Request /themes/kboot/theme-derived.properties
            at org.kuali.rice.krad.uif.util.ProcessLoggingFilter.doFilter(ProcessLoggingFilter.java:69)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
          Initial Memory Usage: 1.304G/2.499G/3.555G - 52% free
          Processing Complete.....................00:00.000 00:00.000 1.304G 0
          Elapsed Time: 00:00.000
          Memory Usage: 1.304G/2.499G/3.555G - 52% free
          Memory Delta: 0/2.499G/3.555G - 0% free - tot delta: 0
          2014-04-18 07:25:34,953 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - reindexing after apply model for view: WorkBibEditorView
          2014-04-18 07:25:34,955 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - performing finalize phase for view: WorkBibEditorView
          2014-04-18 07:25:34,996 [http-8080-3] u:admin/d: INFO  org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - processing final indexing for view: WorkBibEditorView
          

          The request to load WorkBibEditorView now completes in 4.371s, down from 8.38s before applying this change, as noted in the trace data below. Note that this change doesn't improve the memory footprint, but does address much of the processing delay.

          2014-04-18 07:25:35,566 [http-8080-3] u:/d: INFO  org.kuali.rice.krad.uif.util.ProcessLogger - KRAD Process Trace (request): Servlet Request /kr-krad/ole
            at org.kuali.rice.krad.uif.util.ProcessLoggingFilter.doFilter(ProcessLoggingFilter.java:69)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
          Initial Memory Usage: 2.227G/2.499G/3.555G - 89% free
          pre-handle..............................00:00.006 00:00.006 2.227G 0
          apply-model:WorkBibEditorView...........00:03.150 00:03.156 1.314G -934.854M
          apply-comp-model:WorkBibEditorView......00:00.088 00:03.244 1.310G -4.125M
          apply-model-end:WorkBibEditorView.......00:00.515 00:03.759 1.262G -48.118M
          post-handle.............................00:00.044 00:03.803 1.258G -4.125M
          after-completion........................00:00.559 00:04.362 1.222G -37.131M
          after-completion-end....................00:00.007 00:04.369 1.222G 0
          Processing Complete.....................00:00.002 00:04.371 1.222G 0
          Elapsed Time: 00:04.371
          Memory Usage: 1.222G/2.499G/3.555G - 48% free
          Memory Delta: -1.003G/2.499G/3.555G - -40% free - tot delta: 0
          

          I hope you find this POC to be useful in addressing the performance issues in OLE.

          Show
          Mark Fyffe (Inactive) added a comment - I have prepared a small POC against Rice 2.3 that demonstrates how a component override can be used to cut the lifecycle processing time for the empty WorkBibEditorView by 1/3 by removing unused components from the tree. The same approach should prove effective for OLE without much effort. For the three file groups targeted by the analysis generated by Rice 2.5 that I posted yesterday, I have redefined the internal group as follows. One Control_Field_006_Section is shown, but 007 and 008 have been modified in a similar fashion. <bean id= "Control_Field_006_Section" parent= "Uif-VerticalFieldGroup" p:style= "font-weight:bold;border:0px;" > <property name= "group" > <bean parent= "Uif-VerticalBoxGroup" class= "org.kuali.rice.krad.labs.ole.OleControlFieldGroup" p:displayFieldProperty= "displayField006" p:fieldLinkId= "006FieldLink" p:controlFieldGroupId= "Control_Field_006_Data_Section" > <property name= "validationMessages.displayMessages" value= " false " /> </bean> </property> The source for org.kuali.rice.krad.labs.ole.OleControlFieldGroup is below. The purpose of this component override is to inspect the form at the initialize phase, and to prune any components not relevant to the current lifecycle from view processing. This is just an example to illustrate the approach - a solution that is a better fit for OLE, or even a general solution in KRAD, is possible to address similar concerns more thoroughly: package org.kuali.rice.krad.labs.ole; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.kuali.rice.krad.uif.component.Component; import org.kuali.rice.krad.uif.container.Group; import org.kuali.rice.krad.uif.util.ObjectPropertyUtils; import org.kuali.rice.krad.uif.view.View; import org.springframework.util.StringUtils; public class OleControlFieldGroup extends Group { private static final long serialVersionUID = -6929025512918369521L; private static final Logger LOG = Logger .getLogger(OleControlFieldGroup.class); private String displayFieldProperty; private String fieldLinkId; private String controlFieldGroupId; @Override public void performInitialization(View view, Object form) { super .performInitialization(view, form); boolean editable = " true " .equals(((LabsOleEditorForm) form).getEditable()); boolean displayField = " true " .equals(ObjectPropertyUtils.getPropertyValue(form, displayFieldProperty)); LOG.info( "editable " + editable + " displayField " + displayField); List<? extends Component> items = getItems(); LOG.info( "initialize " + displayFieldProperty + " " + fieldLinkId + " " + controlFieldGroupId); if (StringUtils.isEmpty(displayFieldProperty)) { LOG.info( "skip iterator" ); } else { Iterator<? extends Component> itemIterator = items.iterator(); while (itemIterator.hasNext()) { Component component = itemIterator.next(); if (component == null ) { continue ; } LOG.info( "checking component " + component.getId()); // @{editable eq ' true ' and displayField008 eq ' false '} if (fieldLinkId != null && fieldLinkId.equals(component.getId()) && (!editable || displayField)) { LOG.info( "Omitting " + fieldLinkId + " from lifecycle" ); itemIterator.remove(); } // @{editable eq ' true ' and displayField008 eq ' true '} if (controlFieldGroupId != null && controlFieldGroupId.equals(component.getId()) && (!editable || !displayField)) { LOG.info( "Omitting " + controlFieldGroupId + " from lifecycle" ); itemIterator.remove(); } } } } public String getDisplayFieldProperty() { return displayFieldProperty; } public void setDisplayFieldProperty( String displayFieldProperty) { this .displayFieldProperty = displayFieldProperty; } public String getFieldLinkId() { return fieldLinkId; } public void setFieldLinkId( String fieldLinkId) { this .fieldLinkId = fieldLinkId; } public String getControlFieldGroupId() { return controlFieldGroupId; } public void setControlFieldGroupId( String controlFieldGroupId) { this .controlFieldGroupId = controlFieldGroupId; } @Override protected <T> void copyProperties(T component) { super .copyProperties(component); OleControlFieldGroup copy = (OleControlFieldGroup) component; copy.displayFieldProperty = displayFieldProperty; copy.fieldLinkId = fieldLinkId; copy.controlFieldGroupId = controlFieldGroupId; } } Note in the log entries below, that the unneeded components are indeed removed from the group's item list during the initialize phase. 2014-04-18 07:25:31,302 [http-8080-3] u:admin/d: DEBUG org.kuali.rice.krad.datadictionary.uif.UifDictionaryIndex - View WorkBibE ditorView not in cache - creating and storing to cache 2014-04-18 07:25:33,967 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - performing initial ize phase for view: WorkBibEditorView 2014-04-18 07:25:34,134 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - editable false displa yField false 2014-04-18 07:25:34,137 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - initialize displayFie ld006 006FieldLink Control_Field_006_Data_Section 2014-04-18 07:25:34,137 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 00 6load 2014-04-18 07:25:34,137 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 00 6FieldLink 2014-04-18 07:25:34,138 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting 006FieldLink from lifecycle 2014-04-18 07:25:34,138 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component Co ntrol_Field_006_Data_Section 2014-04-18 07:25:34,138 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting Control_Fiel d_006_Data_Section from lifecycle 2014-04-18 07:25:34,241 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - editable false displa yField false 2014-04-18 07:25:34,242 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - initialize displayFie ld007 007FieldLink Control_Field_007_Data_Section 2014-04-18 07:25:34,242 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 007load 2014-04-18 07:25:34,242 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 007FieldLink 2014-04-18 07:25:34,243 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting 007FieldLink from lifecycle 2014-04-18 07:25:34,243 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component Control_Field_007_Data_Section 2014-04-18 07:25:34,243 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting Control_Field_007_Data_Section from lifecycle 2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - editable false displayField false 2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - initialize displayField008 008FieldLink Control_Field_008_Data_Section 2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 008load 2014-04-18 07:25:34,336 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component 008FieldLink 2014-04-18 07:25:34,337 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting 008FieldLink from lifecycle 2014-04-18 07:25:34,337 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - checking component Control_Field_008_Data_Section 2014-04-18 07:25:34,337 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.labs.ole.OleControlFieldGroup - Omitting Control_Field_008_Data_Section from lifecycle 2014-04-18 07:25:34,350 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - performing apply model phase for view: WorkBibEditorView 2014-04-18 07:25:34,473 [http-8080-1] u:/d: INFO org.kuali.rice.krad.uif.util.ProcessLogger - KRAD Process Trace (request): Servlet Request /themes/kboot/theme-derived.properties at org.kuali.rice.krad.uif.util.ProcessLoggingFilter.doFilter(ProcessLoggingFilter.java:69) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) Initial Memory Usage: 1.304G/2.499G/3.555G - 52% free Processing Complete.....................00:00.000 00:00.000 1.304G 0 Elapsed Time: 00:00.000 Memory Usage: 1.304G/2.499G/3.555G - 52% free Memory Delta: 0/2.499G/3.555G - 0% free - tot delta: 0 2014-04-18 07:25:34,953 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - reindexing after apply model for view: WorkBibEditorView 2014-04-18 07:25:34,955 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - performing finalize phase for view: WorkBibEditorView 2014-04-18 07:25:34,996 [http-8080-3] u:admin/d: INFO org.kuali.rice.krad.uif.service.impl.ViewServiceImpl - processing final indexing for view: WorkBibEditorView The request to load WorkBibEditorView now completes in 4.371s, down from 8.38s before applying this change, as noted in the trace data below. Note that this change doesn't improve the memory footprint, but does address much of the processing delay. 2014-04-18 07:25:35,566 [http-8080-3] u:/d: INFO org.kuali.rice.krad.uif.util.ProcessLogger - KRAD Process Trace (request): Servlet Request /kr-krad/ole at org.kuali.rice.krad.uif.util.ProcessLoggingFilter.doFilter(ProcessLoggingFilter.java:69) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) Initial Memory Usage: 2.227G/2.499G/3.555G - 89% free pre-handle..............................00:00.006 00:00.006 2.227G 0 apply-model:WorkBibEditorView...........00:03.150 00:03.156 1.314G -934.854M apply-comp-model:WorkBibEditorView......00:00.088 00:03.244 1.310G -4.125M apply-model-end:WorkBibEditorView.......00:00.515 00:03.759 1.262G -48.118M post-handle.............................00:00.044 00:03.803 1.258G -4.125M after-completion........................00:00.559 00:04.362 1.222G -37.131M after-completion-end....................00:00.007 00:04.369 1.222G 0 Processing Complete.....................00:00.002 00:04.371 1.222G 0 Elapsed Time: 00:04.371 Memory Usage: 1.222G/2.499G/3.555G - 48% free Memory Delta: -1.003G/2.499G/3.555G - -40% free - tot delta: 0 I hope you find this POC to be useful in addressing the performance issues in OLE.
          Hide
          Peri Subrahmanya added a comment -

          Hi Mark,

          We really appreciate the deep analysis and recommendations in such a short period of time. We will be applying the changes and report back the numbers. Thanks again!!

          Show
          Peri Subrahmanya added a comment - Hi Mark, We really appreciate the deep analysis and recommendations in such a short period of time. We will be applying the changes and report back the numbers. Thanks again!!
          Hide
          Mark Fyffe (Inactive) added a comment -

          Thanks Peri.

          I'll leave this issue open for a few days, then cycle back to apply the same updates to the Rice 2.5 performance view and commit. This is very common issue! It may be that we can arrive at a general solution if the results are positive for OLE.

          Best,
          Mark

          Show
          Mark Fyffe (Inactive) added a comment - Thanks Peri. I'll leave this issue open for a few days, then cycle back to apply the same updates to the Rice 2.5 performance view and commit. This is very common issue! It may be that we can arrive at a general solution if the results are positive for OLE. Best, Mark
          Hide
          Mark Fyffe (Inactive) added a comment -

          Resumed progress on this issue. On Rice 2.5, I am working to add the ability to prune components from UIF groups at the initialize phase based on property evaluation. This will eliminate the need to create custom group components in order to carry out the solution originally recommended here, once an application has upgraded to 2.5 or later.

          Show
          Mark Fyffe (Inactive) added a comment - Resumed progress on this issue. On Rice 2.5, I am working to add the ability to prune components from UIF groups at the initialize phase based on property evaluation. This will eliminate the need to create custom group components in order to carry out the solution originally recommended here, once an application has upgraded to 2.5 or later.
          Hide
          Mark Fyffe (Inactive) added a comment -

          Added UIF lifecycle exclusion feature and related labs view as a POC.

          When set on any UIF component, the "excludeIf" and "excludeUnless" properties define property path expressions, which are resolved relative to either the model or the "pre-model" context to indicate components to remove from groups at the initialize phase. Since the components are removed at the initialize phase, they will not be included in collection overhead at the apply-model phase.

          This update has been committed on the 2.5 trunk.

          Show
          Mark Fyffe (Inactive) added a comment - Added UIF lifecycle exclusion feature and related labs view as a POC. When set on any UIF component, the "excludeIf" and "excludeUnless" properties define property path expressions, which are resolved relative to either the model or the "pre-model" context to indicate components to remove from groups at the initialize phase. Since the components are removed at the initialize phase, they will not be included in collection overhead at the apply-model phase. This update has been committed on the 2.5 trunk.

            People

            • Assignee:
              Mark Fyffe (Inactive)
              Reporter:
              Jerry Neal (Inactive)
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Time Tracking

                Estimated:
                Original Estimate - 1 day, 4 hours Original Estimate - 1 day, 4 hours
                1d 4h
                Remaining:
                Remaining Estimate - 0 minutes
                0m
                Logged:
                Time Spent - 2 days, 2 hours
                2d 2h

                  Structure Helper Panel