Thursday, March 28, 2013

HBase: MSLAB and CMS vs. ParallelGC

Tuning Java opts for HBase, for example, are necessary steps to get the best performance and stability in large installations. The optimal recommendation looks like:
HBASE_OPTS="-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled"

But you can also achieve great success with:
HBASE_OPTS="-server -XX:+UseParallelGC XX:+UseParallelOldGC -XX:ParallelGCThreads=8"

What are the differences between ParallelGC and CMS? 

CMS uses more CPU, but runs concurrently. If a thread is failing, CMS falls back to a non-parallel mode and stops the VM for the entire time it's collecting. But this risk can be minimized by using MSLAB in your HBase configuration.
ParallelGC have a better throughput and longer pause times, and stop the VM on every collection. Means for HBase, you'll have a pause (around 1 sec per GB), which can lead on high loaded clusters to outages in a non acceptable time range.

MSLAB (MemStore-Local Allocation Buffers)

The most GC pauses are caused by old-gen fragmentation, and CMS can't defragment without pause the VM (Juliet pause). MSLAB now moves the memstore allocations into the configured chunks into the old generation. When you start or upgrade into HBase 0.92x, MSLAB is enabled per default ( 

hbase.hregion.memstore.mslab.chunksize=2MB (2MB per default)
hbase.hregion.memstore.mslab.max.allocation=256KB (256KB per default)

More about MSLAB you can find in Todd's presentation: