Skip to Content
Technical Articles

Reducing the number of BO DSL service restarts by performing explicit garbage collection

Hello All ,

This post shares about an interim/permanent workflow to avoid frequent restarts of SAP BO DSL APS(DSL Bridge service) which results in report failures.

Background :

DSL Bridge APS is used when refreshing/scheduling a report which is based on SAP BW data source.

DSL Bridge APS is a BO service which runs in Java.exe container and like other APS, the max/min memory allocated to that service is specified through Xmx/Xms values in its command line parameters.

Issue :

We’ve seen DSL Bridge APS getting restarted many times when huge number of reports(based out of BW) runs or a report fetching huge amount of data from BW runs in the system at the same time.Ideally DSL Bridge APS being a Java process restarts itself by it’s own once the maximum memory allocated to it is reached, which results in the failure of reports which is currently running in that particular DSL Bridge APS.

Note : There are some cases where the DSL Bridge APS got struck in ‘Starting’ state once the maximum memory is reached which makes the situation even worse.

DSL Memory Management :

Since DSL Bridge APS is a Java process, it’s memory management has been shifted to Java monitoring tools such as Jconsole. The memory shown in Windows task manager is not the accurate one for this DSL Bridge services.

Java Garbage Collection :

Garbage Collection process is taken care by the JVM implicitly which removes the unused/not referenced objects from the heap and make space for new object creation.

But w.r.t to the DSL Bridge APS, allowing it to reach it’s maximum memory allocated will end up in recycling of the APS and thus results in report failures.

So,instead of waiting for the automatic garbage collection to happen, we can send commands in JVM to call the garbage collector explicitly thus performing the garbage collection process in a timely manner which prevents the DSL from reaching its maximum memory.

How to perform explicit Java garbage collection for a DSL Bridge APS?

Manual process :

Consider a scenario of a processing node which has 2 DSL Bridge APS with maximum memory of 16 GB allocated to it.

  1. Note down the pid of the DSL Bridge APS ( CMC -> Servers)
  2. Open command prompt and go to “SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win64_x64\sapjvm\bin”
  3. Type Jconsole <pid> (Pid of the DSL Bridge APS) which opens the Jconsole utility.
  4. Click on Memory tab and see the heap memory which is used currently by the process.
  5. Click on Perform GC.

 

Current heap usage : Around 7 GB

 

Heap usage after performing GC : Around 0.64 GB

 

6.  The garbage collector will clear the unused/not referenced objects and then you will notice the           reduction in current heap memory usage thus making free memory available for new incoming           objects.

7.  Repeat the same steps(1 – 7) for the other DSL also.

By this way you can prevent the DSL Bridge APS restart by releasing the unused heap memory.

So,you can set up a Monitoring alert for DSL Bridge APS at certain threshold limit(maybe at 75% of maximum memory) and do the GC through Jconsole,once after receiving the alert.The above illustrated is the manual workflow and you can automate this.

Automated process :

We’ve automated the above process using Powershell script. I’ve added the code below.

Note: The script is in POWERSHELL, so save it as .ps1 file and execute it.

Below is the logic of the attached script.

  1. It will check for all processes called “java.exe” currently running in that node and extract the details.
  2. It will fetch the corresponding pid’s of all the Java process.
  3. For each pid’s collected in the above step,it will filter only the process which has the phrase “DataAccessDSL” in it’s command line.
Note : It completely depends on your platform naming convention.We have two DSL Bridge APS with suffix(“DataAccessDSL”),so we opted for that name.It’s main purpose is to isolate the DSL Bridge APS from other APS from its command line.

4. Then it will it trigger the  gc() function to call the garbage collector though Jcmd(Java command           line utility) to act on the isolated pid’s which will free up the heap memory.

 

$process_name= get-process -name java |Sort-Object -Descending WS 
$proc_ids =$process_name.id
foreach ($proc_id in $proc_ids)
{

$command = Get-CimInstance Win32_Process -Filter "ProcessId = $proc_id" 
$cmd_line = $command.CommandLine
if($cmd_line -Match "DataAccessDSL")
{
PsExec -s -accepteula "F:\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win64_x64\sapjvm\bin\jcmd" $proc_id GC.run

}
}

Points to note :

  1. The power shell script uses PsExec command to call the java garbage collector function(gc()) using the java command line utility called Jcmd.exe which is available under “SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win64_x64\sapjvm\bin”
  2. This script has to been scheduled via Windows task scheduler to run in specific intervals throughout a day or only during the peak usage time.(Depends on your flexibility)
  3. This script adds very minimal(negligible) load on the server.

Hope this article helps Admins in getting rid of DSL restarts which results in report failures.

Kindly share your thoughts on this.

 

Thanks & Regards,

Manhoj Viknesh

4 Comments
You must be Logged on to comment or reply to a post.