Identity Manager Memory Usage by the Health Job Cached Statistics

  • 7002809
  • 24-Mar-2009
  • 26-Apr-2012

Environment

Novell Identity Manager 3.6
Novell Identity Manager iManager Plug-ins

Situation

How much memory does the health check feature use and where is the data kept?

Resolution

The check driver health job takes a snapshot of the event data every xxx minutes (xxx minutes determined by a setting in the check driver health configuration). We keep historical data in memory for every driver for which health check is configured. If the check driver health job is stopped you lose the data.

The number of samples that we keep for every driver is
Samples = ((duration * duration units) / (polling interval * polling units)) + 1;
For example. If you configure the health job for a duration of 12 hours and polling interval of 1 minute.  The number of samples would be (12*60) / (1*1) + 1 = 721
This is the number of samples per driver per server. If you have 4 drivers with health check configured that run on one server. You would have 4*721=2884 samples.
This can be found using the following command on Linux.
XXXX:~ # jmap -F -histo `pgrep ndsd` | grep HistoricalData
576800 2884
com.novell.nds.dirxml.job.ckdrvhealth.CheckDriverHealthJob$HistoricalData

Each sample stores data from 5 points in the publisher and 5 points in the subscriber channels. (same as dxcmd - Get driver cache statistics)

They are as follows:

publisher-commands
publisher-command-results
publisher-post-event-transformation
publisher-post-input-transformation
publisher-reported-events
subscriber-commands
subscriber-command-results
subscriber-pre-output-transformation
subscriber-post-event-transformation
subscriber-reported-events
 

For each, there is a byte[] to store ids and int[] to store counts. ids corresponds to operations like query, status, instance, add-association, etc.
 
For the following cache statistics,
    <subscriber>
        <operations>
            <command-results>
                <status>12</status>
                <instance>12</instance>
            </command-results>
        </operations>
    </subscriber>
 
We have subscriber-command-results byte[] with entries 7,21 (for instance and status) and int[] with entries 12,12.
I have 10 int[] and 10 byte[] with average size 1 that makes it 20*32 = 640 bytes.
Each sample consumes ~700 bytes and we have 721 samples. We have ~ 500 KB per driver.
For 4 drivers, I see that 2 MB is consumed by Historical Data objects.