Bug ID 1025261: Restjavad uses more resident memory in control plane after software upgrade

Last Modified: Jan 19, 2023

Bug Tracker

Affected Product:  See more info
BIG-IP TMOS(all modules)

Known Affected Versions:
17.0.0, 16.1.3, 16.1.2.2, 16.1.2.1, 16.1.2, 16.1.1, 16.1.0, 16.0.1.2, 16.0.1.1, 15.1.6.1, 15.1.6, 15.1.5.1, 15.1.5, 15.1.4.1, 15.1.4, 15.1.3.1, 15.1.3, 14.1.5, 14.1.4.6, 14.1.4.5, 14.1.4.4, 14.1.4.3, 14.1.4.2, 14.1.4.1, 14.1.4

Fixed In:
17.0.0.1, 16.1.3.1, 15.1.7, 14.1.5.1

Opened: Jun 14, 2021
Severity: 3-Major

Symptoms

The restjavad process immediately reserves more memory and the process size (as shown by RSS) increases as the starting heap size has been made to be the same as maximum heap size for performance reasons. (Note the process name displays as 'java', but there are multiple independent Java processes on the system. The parent process of restjavad is 'runsv restjavad', and the command line arguments may have 'logging' in them.) For restjavad with the default size, the increase is usually 200 MB-300 MB. The increase is particularly apparent where restjavad.useextramb is set to the value 'true' and provision.extramb is set to a high value but restjavad had not required that much extra memory previously.

Impact

The memory Resident Set Size (RSS) of the restjavad process will be larger than needed, possibly constricting other processes in the control plane.

Conditions

After upgrading to a BIG-IP software version with the fix for ID 776393 ( https://cdn.f5.com/product/bugtracker/ID776393.html ), where more memory has been allocated for restjavad.

Workaround

If restjavad.useextramb is set to value true you may find that if only a small amount of extra restjavad memory was required (~192 MB or less extra) that it can be set to false. This is because the default size of restjavad has increased by 192 MB to 384MB. Restart restjavad after the change.

Fix Information

A new sys DB variable, provision.restjavad.extramb has been introduced to allow finer-grained control of restjavad memory. It takes effect only if sys db restjavad.useextramb is true. It can be used to set restjavad heap size both above and below the default heap size of 384 MB.

Behavior Change

A new sys DB variable, provision.restjavad.extramb has been introduced to allow finer-grained control of restjavad memory. The variable is particularly useful when you need restjavad to be slightly bigger and also need a much larger provision.extramb without most of that being taken by restjavad. For the variable to take effect, sys db restjavad.useextramb must be set to 'true'; otherwise, default memory values are used. The variable sets the heap size, and defaults to and has a minimum value of 192 MB. If the value of provision.restjavad.extramb is set above a certain cap value, the heap size will be set to the cap value. In this release, the cap value 384 MB + 80% of provision.extramb. So with restjavad.useextramb set to 'true', you can set the restjavad heap size from 192 MB to 384 MB + 80% of provision.extramb using the provision.restjavad.extramb variable. After changing value of provision.restjavad.extramb, restart restjavad to enable the change in memory size: bigstart restart restjavad Or on multi-blade systems: clsh bigstart restart restjavad If using a sys db restjavad.useextramb value of true and needing to restore your previous restjavad memory setting ( based on maximum heap size) please look at advice below. Before upgrade - if you set sys db restjavad.useextramb to value false before install of new version you will have more restjavad memory, the default 384MB, after upgrade. tmsh modify sys db restjavad.useextramb value false If you restart restjavad you can see if that value works before upgrade. If you don't restart then it will come into effect after reboot. If that no longer has issues after update then leave that setting at false. Otherwise set back to true (no restart) and increase provision.restjavad.extramb as in After upgrade section below. After upgrade: Set sys db provision.restjavad.extramb to an appropriate value and restart restjavad. Run the following command: tmsh modify sys db provision.restjavad.extramb value X bigstart restart restjavad Iterate as necessary. The value of X is derived by using one of the following formulae: - When updating from versions before 14.1.4 and 15.1.3, to affected versions, a value that preserves the maximum previous restjavad heap size is: 192MB + 80% of MIN(provision.extramb|2500) the minimum possible heap size was: 192MB + 20% of MIN(provision.extramb|2500) The actual restjavad heap size would be between those extremes. SSLO systems would typically need a higher amount towards the maximum. Example 1: If provision.restjavad was 1000 MB on previous version, the possible range of restjavad heap size would have been between (20% of 1000 + 192) = 392 MB and (80% of 1000 + 192) = 992 MB. Example 2: If provision.extramb was 4000 MB, the possible range would be between (20 % of 2500 + 192) = 692 MB and (80% of 2500 + 192) = 2192 MB. - When updating from 14.1.4-14.1.5, from 15.1.3-15.1.6.1 or from 16.0.x to affected versions: 384MB + 80% of MIN(provision.extramb|2500) Example 3: If provision.extramb was 500 MB, the restjavad heap size on the previous version would have been 80% of 500 + 384 = 784 MB. - When updating from 16.1.0-16.1.3 or from 17.0.0.0 to affected versions: 384MB + 90% of MIN(provision.extramb|4000) Example 4: If provision.extramb was 2000 MB, the restjavad heap size on the previous version would have been 90% of 2000 + 384 = 2184 MB.