The following sections describe how to tune Java Virtual Machine (JVM) garbage collection performance for engine tier servers:
Production installations of WebLogic SIP Server generally require extremely small response times (under 50 milliseconds) for clients at all times, even under peak server loads. A key factor in maintaining brief response times is the proper selection and tuning of the JVM's Garbage Collection (GC) algorithm for WebLogic SIP Server instances in the engine tier.
Whereas certain tuning strategies are designed to yield the lowest average garbage collection times or to minimize the frequency of full GCs, those strategies can sometimes result in one or more very long periods of garbage collection (often several seconds long) that are offset by shorter GC intervals. With a production SIP Server installation, all long GC intervals must be avoided in order to maintain response time goals.
The sections that follow describe GC tuning strategies for JRockit and Sun's JVM that generally result in best response time performance.
If you use custom startup scripts to start WebLogic SIP Server engines and replicas, simply edit those scripts to include the recommended JVM options described in the sections that follow.
The BEA Configuration Wizard also installs default startup scripts when you configure a new domain. These scripts are installed in the BEA_HOME
/bin directory by default, and include:
If you use the BEA-installed scripts to start engines and replicas, you can override JVM memory arguments by first setting the
USER_MEM_ARGS environment variable in your command shell.
Very short response times are most easily achieved by using JRockit's deterministic garbage collector, which is available with BEA WebLogic Real Time as a seaparate license. BEA recommends using the following JVM arguments for replicated cluster configurations:
-Xmx1gsets the initial and maximum heap size to 1GB.
-XgcPrio:deterministicuses the dynamic garbage collector with deterministic garbage collection.
-XpauseTarget=30mssets the maximum pause time at 30ms.
-XXtlasize=6ksets the thread-local area size to 6K.
-XXnosystemgcprevents System.gc() application calls from forcing garbage collection.
When using BEA's JRockit JVM without deterministic garbage collection (the default version installed with WebLogic SIP Server), the best response time performance is generally obtained by using the single-spaced, concurrent garbage collector with a very small (1%) compaction rate.
The full list of example startup options for a replica server are:
-Xgc:singlecon -XXcompactratio:1 -Xms1536m -Xmx1536m -XXtlasize=6k
The full list of example startup options for an engine tier server are:
-Xgc:singlecon -XXcompactratio:1 -Xms768m -Xmx768m -XXtlasize=6k -Dwlss.noExplictGC=true
It is important to use the low compaction ratio setting along with the single-spaced GC algorithm to obtain the best response time performance. Note, however, that using the indicated compaction ratio may be problematic if you deploy applications that periodically allocate drastically different sizes of memory in the heap (for example a 10K allocation followed by byte-sized increments).
|WARNING:||If you deploy applications that allocate varying sizes of memory, using a small compaction ratio may lead to Out Of Memory errors or forced compaction, both of which must be avoided in a production system. You must thoroughly analyze deployed applications in a stage environment to determine which JVM settings are acceptable for your system.|
JRockit provides several monitoring tools that you can use to analyze the JVM heap at any given moment, including:
Use these and other tools in a controlled environment to determine the effects of JVM settings before you use the settings in a production deployment. See thefor more information about JRockit and JRockit profiling tools.
When using Sun's JDK, the goal in tuning garbage collection performance is to reduce the time required to perform a full garbage collection cycle. You should not attempt to tune the JVM to minimize the frequency of full garbage collections, because this generally results in an eventual forced garbage collection cycle that may take up to several full seconds to complete.
The simplest and most reliable way to achieve short garbage collection times over the lifetime of a production server is to use a fixed heap size with the default collector and the parallel young generation collector, restricting the new generation size to at most one third of the overall heap.
The following example JVM settings are recommended for most engine tier servers:
-server -XX:MaxPermSize=128m -XX:+UseParNewGC -XX:MaxNewSize=256m -XX:NewSize=256m -Xms768m -Xmx768m -XX:SurvivorRatio=128 -XX:MaxTenuringThreshold=0 -XX:+UseTLAB -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
If the engine tier server enables caching for call state data, the example settings are:
-server -XX:MaxPermSize=128m -XX:+UseParNewGC -XX:MaxNewSize=32m -XX:NewSize=32m -Xms768m -Xmx768m -XX:SurvivorRatio=128 -XX:MaxTenuringThreshold=0 -XX:+UseTLAB -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
For replica servers, use the example settings:
-server -XX:MaxPermSize=128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxNewSize=64m -XX:NewSize=64m -Xms1536m -Xmx1536m -XX:SurvivorRatio=128 -XX:MaxTenuringThreshold=0 -XX:CMSInitiatingOccupancyFraction=60 -Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFFE -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFFE
The above options have the following effect:
-XX:+UseTLAB—Uses thread-local object allocation blocks. This improves concurrency by reducing contention on the shared heap lock.
-XX:+UseParNewGC—Uses a parallel version of the young generation copying collector alongside the default collector. This minimizes pauses by using all available CPUs in parallel. The collector is compatible with both the default collector and the Concurrent Mark and Sweep (CMS) collector.
-Xms, -Xmx—Places boundaries on the heap size to increase the predictability of garbage collection.
The heap size is limited in replica servers so that even Full GCs do not trigger SIP retransmissions.
-Xmssets the starting size to prevent pauses caused by heap expansion.
-XX:NewSize—Defines the minimum young generation size. BEA recommends testing your production applications starting with a young generation size of 1/3 the total heap size. Using a larger young generation size causes fewer minor collections to occur but may compromise response time goals by cause longer-running full collections.
You can fine-tune the frequency of minor collections by gradually reducing the size of the heap allocated to the young generation to a point below which the observed response time becomes unacceptable.
-XX:MaxTenuringThreshold=0—Makes the full NewSize available to every NewGC cycle, and reduces the pause time by not evaluating tenured objects. Technically, this setting promotes all live objects to the older generation, rather than copying them.
-XX:SurvivorRatio=128—Specifies a high survivor ratio, which goes along with the zero tenuring threshold to ensure that little space is reserved for absent survivors.