HBASE-18652 Expose individual cache stats in a CombinedCache through JMX

Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
Biju Nair 2017-08-25 17:13:16 -04:00 committed by tedyu
parent 52d4b25754
commit 36371acee7
7 changed files with 213 additions and 7 deletions

View File

@ -348,7 +348,22 @@ public interface MetricsRegionServerSource extends BaseSource, JvmPauseMonitorSo
String BLOCK_CACHE_GENERAL_BLOOM_META_HIT_COUNT = "blockCacheGeneralBloomMetaHitCount"; String BLOCK_CACHE_GENERAL_BLOOM_META_HIT_COUNT = "blockCacheGeneralBloomMetaHitCount";
String BLOCK_CACHE_DELETE_FAMILY_BLOOM_HIT_COUNT = "blockCacheDeleteFamilyBloomHitCount"; String BLOCK_CACHE_DELETE_FAMILY_BLOOM_HIT_COUNT = "blockCacheDeleteFamilyBloomHitCount";
String BLOCK_CACHE_TRAILER_HIT_COUNT = "blockCacheTrailerHitCount"; String BLOCK_CACHE_TRAILER_HIT_COUNT = "blockCacheTrailerHitCount";
String L1_CACHE_HIT_COUNT = "l1CacheHitCount";
String L1_CACHE_HIT_COUNT_DESC = "L1 cache hit count.";
String L1_CACHE_MISS_COUNT = "l1CacheMissCount";
String L1_CACHE_MISS_COUNT_DESC = "L1 cache miss count.";
String L1_CACHE_HIT_RATIO = "l1CacheHitRatio";
String L1_CACHE_HIT_RATIO_DESC = "L1 cache hit ratio.";
String L1_CACHE_MISS_RATIO = "l1CacheMissRatio";
String L1_CACHE_MISS_RATIO_DESC = "L1 cache miss ratio.";
String L2_CACHE_HIT_COUNT = "l2CacheHitCount";
String L2_CACHE_HIT_COUNT_DESC = "L2 cache hit count.";
String L2_CACHE_MISS_COUNT = "l2CacheMissCount";
String L2_CACHE_MISS_COUNT_DESC = "L2 cache miss count.";
String L2_CACHE_HIT_RATIO = "l2CacheHitRatio";
String L2_CACHE_HIT_RATIO_DESC = "L2 cache hit ratio.";
String L2_CACHE_MISS_RATIO = "l2CacheMissRatio";
String L2_CACHE_MISS_RATIO_DESC = "L2 cache miss ratio.";
String RS_START_TIME_NAME = "regionServerStartTime"; String RS_START_TIME_NAME = "regionServerStartTime";
String ZOOKEEPER_QUORUM_NAME = "zookeeperQuorum"; String ZOOKEEPER_QUORUM_NAME = "zookeeperQuorum";
String SERVER_NAME_NAME = "serverName"; String SERVER_NAME_NAME = "serverName";

View File

@ -268,6 +268,46 @@ public interface MetricsRegionServerWrapper {
*/ */
long getBlockCacheFailedInsertions(); long getBlockCacheFailedInsertions();
/**
* Hit count of L1 cache.
*/
public long getL1CacheHitCount();
/**
* Miss count of L1 cache.
*/
public long getL1CacheMissCount();
/**
* Hit ratio of L1 cache.
*/
public double getL1CacheHitRatio();
/**
* Miss ratio of L1 cache.
*/
public double getL1CacheMissRatio();
/**
* Hit count of L2 cache.
*/
public long getL2CacheHitCount();
/**
* Miss count of L2 cache.
*/
public long getL2CacheMissCount();
/**
* Hit ratio of L2 cache.
*/
public double getL2CacheHitRatio();
/**
* Miss ratio of L2 cache.
*/
public double getL2CacheMissRatio();
/** /**
* Force a re-computation of the metrics. * Force a re-computation of the metrics.
*/ */

View File

@ -460,6 +460,22 @@ public class MetricsRegionServerSourceImpl
.addCounter(Interns.info(BLOCK_CACHE_DELETE_FAMILY_BLOOM_HIT_COUNT, ""), .addCounter(Interns.info(BLOCK_CACHE_DELETE_FAMILY_BLOOM_HIT_COUNT, ""),
rsWrap.getDeleteFamilyBloomHitCount()) rsWrap.getDeleteFamilyBloomHitCount())
.addCounter(Interns.info(BLOCK_CACHE_TRAILER_HIT_COUNT, ""), rsWrap.getTrailerHitCount()) .addCounter(Interns.info(BLOCK_CACHE_TRAILER_HIT_COUNT, ""), rsWrap.getTrailerHitCount())
.addGauge(Interns.info(L1_CACHE_HIT_COUNT, L1_CACHE_HIT_COUNT_DESC),
rsWrap.getL1CacheHitCount())
.addGauge(Interns.info(L1_CACHE_MISS_COUNT, L1_CACHE_MISS_COUNT_DESC),
rsWrap.getL1CacheMissCount())
.addGauge(Interns.info(L1_CACHE_HIT_RATIO, L1_CACHE_HIT_RATIO_DESC),
rsWrap.getL1CacheHitRatio())
.addGauge(Interns.info(L1_CACHE_MISS_RATIO, L1_CACHE_MISS_RATIO_DESC),
rsWrap.getL1CacheMissRatio())
.addGauge(Interns.info(L2_CACHE_HIT_COUNT, L2_CACHE_HIT_COUNT_DESC),
rsWrap.getL2CacheHitCount())
.addGauge(Interns.info(L2_CACHE_MISS_COUNT, L2_CACHE_MISS_COUNT_DESC),
rsWrap.getL2CacheMissCount())
.addGauge(Interns.info(L2_CACHE_HIT_RATIO, L2_CACHE_HIT_RATIO_DESC),
rsWrap.getL2CacheHitRatio())
.addGauge(Interns.info(L2_CACHE_MISS_RATIO, L2_CACHE_MISS_RATIO_DESC),
rsWrap.getL2CacheMissRatio())
.addCounter(Interns.info(UPDATES_BLOCKED_TIME, UPDATES_BLOCKED_DESC), .addCounter(Interns.info(UPDATES_BLOCKED_TIME, UPDATES_BLOCKED_DESC),
rsWrap.getUpdatesBlockedTime()) rsWrap.getUpdatesBlockedTime())
.addCounter(Interns.info(FLUSHED_CELLS, FLUSHED_CELLS_DESC), .addCounter(Interns.info(FLUSHED_CELLS, FLUSHED_CELLS_DESC),

View File

@ -547,7 +547,8 @@ public class CacheConfig {
// Clear this if in tests you'd make more than one block cache instance. // Clear this if in tests you'd make more than one block cache instance.
@VisibleForTesting @VisibleForTesting
static BlockCache GLOBAL_BLOCK_CACHE_INSTANCE; static BlockCache GLOBAL_BLOCK_CACHE_INSTANCE;
private static LruBlockCache GLOBAL_L1_CACHE_INSTANCE; private static LruBlockCache GLOBAL_L1_CACHE_INSTANCE = null;
private static BlockCache GLOBAL_L2_CACHE_INSTANCE = null;
/** Boolean whether we have disabled the block cache entirely. */ /** Boolean whether we have disabled the block cache entirely. */
@VisibleForTesting @VisibleForTesting
@ -561,6 +562,20 @@ public class CacheConfig {
return getL1Internal(c); return getL1Internal(c);
} }
public CacheStats getL1Stats() {
if (GLOBAL_L1_CACHE_INSTANCE != null) {
return GLOBAL_L1_CACHE_INSTANCE.getStats();
}
return null;
}
public CacheStats getL2Stats() {
if (GLOBAL_L2_CACHE_INSTANCE != null) {
return GLOBAL_L2_CACHE_INSTANCE.getStats();
}
return null;
}
/** /**
* @param c Configuration to use. * @param c Configuration to use.
* @return An L1 instance. Currently an instance of LruBlockCache. * @return An L1 instance. Currently an instance of LruBlockCache.
@ -593,10 +608,12 @@ public class CacheConfig {
// If we want to use an external block cache then create that. // If we want to use an external block cache then create that.
if (useExternal) { if (useExternal) {
return getExternalBlockcache(c); GLOBAL_L2_CACHE_INSTANCE = getExternalBlockcache(c);
} } else {
// otherwise use the bucket cache. // otherwise use the bucket cache.
return getBucketCache(c); GLOBAL_L2_CACHE_INSTANCE = getBucketCache(c);
}
return GLOBAL_L2_CACHE_INSTANCE;
} }
private static BlockCache getExternalBlockcache(Configuration c) { private static BlockCache getExternalBlockcache(Configuration c) {

View File

@ -107,6 +107,8 @@ class MetricsRegionServerWrapperImpl
private volatile long averageRegionSize = 0L; private volatile long averageRegionSize = 0L;
private CacheStats cacheStats; private CacheStats cacheStats;
private CacheStats l1Stats = null;
private CacheStats l2Stats = null;
private ScheduledExecutorService executor; private ScheduledExecutorService executor;
private Runnable runnable; private Runnable runnable;
private long period; private long period;
@ -148,9 +150,13 @@ class MetricsRegionServerWrapperImpl
*/ */
private synchronized void initBlockCache() { private synchronized void initBlockCache() {
CacheConfig cacheConfig = this.regionServer.cacheConfig; CacheConfig cacheConfig = this.regionServer.cacheConfig;
if (cacheConfig != null && this.blockCache == null) { if (cacheConfig != null) {
l1Stats = cacheConfig.getL1Stats();
l2Stats = cacheConfig.getL2Stats();
if (this.blockCache == null) {
this.blockCache = cacheConfig.getBlockCache(); this.blockCache = cacheConfig.getBlockCache();
} }
}
if (this.blockCache != null && this.cacheStats == null) { if (this.blockCache != null && this.cacheStats == null) {
this.cacheStats = blockCache.getStats(); this.cacheStats = blockCache.getStats();
@ -373,6 +379,70 @@ class MetricsRegionServerWrapperImpl
return this.cacheStats.getFailedInserts(); return this.cacheStats.getFailedInserts();
} }
@Override
public long getL1CacheHitCount() {
if (this.l1Stats == null) {
return 0;
}
return this.l1Stats.getHitCount();
}
@Override
public long getL1CacheMissCount() {
if (this.l1Stats == null) {
return 0;
}
return this.l1Stats.getMissCount();
}
@Override
public double getL1CacheHitRatio() {
if (this.l1Stats == null) {
return 0;
}
return this.l1Stats.getHitRatio();
}
@Override
public double getL1CacheMissRatio() {
if (this.l1Stats == null) {
return 0;
}
return this.l1Stats.getMissRatio();
}
@Override
public long getL2CacheHitCount() {
if (this.l2Stats == null) {
return 0;
}
return this.l2Stats.getHitCount();
}
@Override
public long getL2CacheMissCount() {
if (this.l2Stats == null) {
return 0;
}
return this.l2Stats.getMissCount();
}
@Override
public double getL2CacheHitRatio() {
if (this.l2Stats == null) {
return 0;
}
return this.l2Stats.getHitRatio();
}
@Override
public double getL2CacheMissRatio() {
if (this.l2Stats == null) {
return 0;
}
return this.l2Stats.getMissRatio();
}
@Override public void forceRecompute() { @Override public void forceRecompute() {
this.runnable.run(); this.runnable.run();
} }

View File

@ -265,6 +265,46 @@ public class MetricsRegionServerWrapperStub implements MetricsRegionServerWrappe
return 36; return 36;
} }
@Override
public long getL1CacheHitCount() {
return 200;
}
@Override
public long getL1CacheMissCount() {
return 100;
}
@Override
public double getL1CacheHitRatio() {
return 80;
}
@Override
public double getL1CacheMissRatio() {
return 20;
}
@Override
public long getL2CacheHitCount() {
return 800;
}
@Override
public long getL2CacheMissCount() {
return 200;
}
@Override
public double getL2CacheHitRatio() {
return 90;
}
@Override
public double getL2CacheMissRatio() {
return 10;
}
@Override @Override
public long getUpdatesBlockedTime() { public long getUpdatesBlockedTime() {
return 419; return 419;

View File

@ -99,6 +99,14 @@ public class TestMetricsRegionServer {
HELPER.assertGauge("blockCacheCountHitPercent", 98, serverSource); HELPER.assertGauge("blockCacheCountHitPercent", 98, serverSource);
HELPER.assertGauge("blockCacheExpressHitPercent", 97, serverSource); HELPER.assertGauge("blockCacheExpressHitPercent", 97, serverSource);
HELPER.assertCounter("blockCacheFailedInsertionCount", 36, serverSource); HELPER.assertCounter("blockCacheFailedInsertionCount", 36, serverSource);
HELPER.assertGauge("l1CacheHitCount", 200, serverSource);
HELPER.assertGauge("l1CacheMissCount", 100, serverSource);
HELPER.assertGauge("l1CacheHitRatio", 80, serverSource);
HELPER.assertGauge("l1CacheMissRatio", 20, serverSource);
HELPER.assertGauge("l2CacheHitCount", 800, serverSource);
HELPER.assertGauge("l2CacheMissCount", 200, serverSource);
HELPER.assertGauge("l2CacheHitRatio", 90, serverSource);
HELPER.assertGauge("l2CacheMissRatio", 10, serverSource);
HELPER.assertCounter("updatesBlockedTime", 419, serverSource); HELPER.assertCounter("updatesBlockedTime", 419, serverSource);
} }