Cognos Analytics

 View Only

 Java Application Performance: High Load Then Normalization

Choal chris's profile image
Choal chris posted Tue November 12, 2024 10:01 PM

I’ve noticed that the Java application I’m running sometimes experiences high load, followed by a drop back to normal usage. Could this be related to a certain task or a memory management issue? What steps can I take to monitor and resolve this issue?

Jeam Coelho's profile image
Jeam Coelho IBM Champion

Hi,

I've been monitoring Cognos Java process, either WLP, Query Service and Flint service using tools like VisualVM and https://www.gceasy.io/

Another tool to analyze GC verbose logs is IBM Garbabe and Memory Analyzer <https://www.ibm.com/docs/en/mon-diag-tools?topic=monitoring-diagnostic-tools-garbage-collection-memory-visualizer>


At Query Service and Flint you can add additional JVM options to exposure JMX metrics.

At bin64 folder, you can edit bootstrap_wlp_"os".xml and add these lines bellow tag <param>-verbose:gc</param>

<param condName="${java_vendor}" condValue="IBM">-Xverbosegclog:../logs/disp_gc.log,10,10000</param>
<param condName="${java_vendor}" condValue="IBM">-Dcom.sun.management.jmxremote</param>
<param condName="${java_vendor}" condValue="IBM">-Dcom.sun.management.jmxremote.authenticate=false</param>
<param condName="${java_vendor}" condValue="IBM">-Dcom.sun.management.jmxremote.ssl=false</param>
<param condName="${java_vendor}" condValue="IBM">-Dcom.sun.management.jmxremote.port=16165</param>
<param condName="${java_vendor}" condValue="IBM">-Dcom.sun.management.jmxremote.rmi.port=16165</param>

It will create a file disp_gc.log in your Cognos logs that you can use GC Easy to analyze. And you can connect VisualVM at port 16165 to see JVM behaviour in real time.

For query service and flint, you should use different ports other than 16165. I usually set to 16166 and 16167.

For this Query Service, at Admin Console > Configuration > Dispatchers and Services > Configuration > Query Service JVM Args, fill the field with

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=16166 -Dcom.sun.management.jmxremote.rmi.port=16166

For flint, at Admin Console > Configuration > Dispatchers and Services > Configuration > Advanced Configuration, add this parameter qs.queryExecution.flintServer.extraJavaOptions with value 

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=16167 -Dcom.sun.management.jmxremote.rmi.port=16167

You may notice that in /logs/XQE folder, Cognos generates verbose for flint and query service by itself. You can upload to GC Easy either.

I have notice that Cognos use more young generation (nursery) than old gen. So I've balanced WLP and Query service to 75% nursery. 
For flint is almost needed nursery. For example, with 12GB for flint, I set 10GB for nursery.

Other thing is that using IBM JRE, the bootstrap set to use a half memory set in Cognos Configuration. 
You will see this king of thing {dispatcherMaxMemoryBy2}. I edited bootstrap to use all memory that I set. And I set -Xmn to a hard-coded value. For dispatcher install 75% of JVM size for nursery. For CM install, 50% for nursery.

I'm responsible for one of the biggest environments of Cognos, with 20k users and more than 180k report/dash executions per day. This metrics that I have and set, works very fine.