From 66216556cc3449e89c47ac407d4e7c93422f6b19 Mon Sep 17 00:00:00 2001
From: Biju Nair
Date: Wed, 23 Aug 2017 16:19:31 -0400
Subject: [PATCH] HBASE-18532 Improve cache related stats rendered on RS UI
---
.../hadoop/hbase/io/hfile/MemcachedBlockCache.java | 10 ++++++++
.../hbase/tmpl/regionserver/BlockCacheTmpl.jamon | 9 +++----
.../apache/hadoop/hbase/io/hfile/BlockCache.java | 13 ++++++++++
.../hadoop/hbase/io/hfile/CombinedBlockCache.java | 10 ++++++++
.../hadoop/hbase/io/hfile/LruBlockCache.java | 30 +++++++++++++++++++++-
.../hadoop/hbase/io/hfile/bucket/BucketCache.java | 10 ++++++++
.../hbase/regionserver/TestHeapMemoryManager.java | 10 ++++++++
7 files changed, 86 insertions(+), 6 deletions(-)
diff --git a/hbase-external-blockcache/src/main/java/org/apache/hadoop/hbase/io/hfile/MemcachedBlockCache.java b/hbase-external-blockcache/src/main/java/org/apache/hadoop/hbase/io/hfile/MemcachedBlockCache.java
index 54cb8b642a..f50a117887 100644
--- a/hbase-external-blockcache/src/main/java/org/apache/hadoop/hbase/io/hfile/MemcachedBlockCache.java
+++ b/hbase-external-blockcache/src/main/java/org/apache/hadoop/hbase/io/hfile/MemcachedBlockCache.java
@@ -205,11 +205,21 @@ public class MemcachedBlockCache implements BlockCache {
}
@Override
+ public long getCurrentDataSize() {
+ return 0;
+ }
+
+ @Override
public long getBlockCount() {
return 0;
}
@Override
+ public long getDataBlockCount() {
+ return 0;
+ }
+
+ @Override
public Iterator iterator() {
return new Iterator() {
@Override
diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/BlockCacheTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/BlockCacheTmpl.jamon
index daa5d76877..3d2606b57e 100644
--- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/BlockCacheTmpl.jamon
+++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/BlockCacheTmpl.jamon
@@ -327,25 +327,25 @@ are combined counts. Request count is sum of hits and misses.
%if>
| Count |
- <% String.format("%,d", cbsbf.getCount()) %> |
+ <% String.format("%,d", bc.getBlockCount()) %> |
Count of Blocks |
<%if !bucketCache %>
| Count |
- <% String.format("%,d", cbsbf.getDataCount()) %> |
+ <% String.format("%,d", bc.getDataBlockCount()) %> |
Count of DATA Blocks |
%if>
| Size |
- <% TraditionalBinaryPrefix.long2String(cbsbf.getSize(), "B", 1) %> |
+ <% TraditionalBinaryPrefix.long2String(bc.getCurrentSize(), "B", 1) %> |
Size of Blocks |
<%if !bucketCache %>
| Size |
- <% TraditionalBinaryPrefix.long2String(cbsbf.getDataSize(), "B", 1) %> |
+ <% TraditionalBinaryPrefix.long2String(bc.getCurrentDataSize(), "B", 1) %> |
Size of DATA Blocks |
%if>
@@ -371,4 +371,3 @@ are combined counts. Request count is sum of hits and misses.
cbsbf = null;
%java>
%def>
-
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java
index 57c4be92c0..35cec262b1 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java
@@ -101,6 +101,13 @@ public interface BlockCache extends Iterable {
*/
long getCurrentSize();
+
+ /**
+ * Returns the occupied size of data blocks, in bytes.
+ * @return occupied space in cache, in bytes
+ */
+ long getCurrentDataSize();
+
/**
* Returns the number of blocks currently cached in the block cache.
* @return number of blocks in the cache
@@ -108,6 +115,12 @@ public interface BlockCache extends Iterable {
long getBlockCount();
/**
+ * Returns the number of data blocks currently cached in the block cache.
+ * @return number of blocks in the cache
+ */
+ long getDataBlockCount();
+
+ /**
* @return Iterator over the blocks in the cache.
*/
Iterator iterator();
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java
index 4a1c2c7660..391dcae5d6 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java
@@ -122,10 +122,20 @@ public class CombinedBlockCache implements ResizableBlockCache, HeapSize {
}
@Override
+ public long getCurrentDataSize() {
+ return lruCache.getCurrentDataSize() + l2Cache.getCurrentDataSize();
+ }
+
+ @Override
public long getBlockCount() {
return lruCache.getBlockCount() + l2Cache.getBlockCount();
}
+ @Override
+ public long getDataBlockCount() {
+ return lruCache.getDataBlockCount() + l2Cache.getDataBlockCount();
+ }
+
public static class CombinedCacheStats extends CacheStats {
private final CacheStats lruCacheStats;
private final CacheStats bucketCacheStats;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
index f427e0466d..c4234f2129 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
@@ -172,9 +172,15 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
/** Current size of cache */
private final AtomicLong size;
+ /** Current size of data blocks */
+ private final AtomicLong dataBlockSize;
+
/** Current number of cached elements */
private final AtomicLong elements;
+ /** Current number of cached data block elements */
+ private final AtomicLong dataBlockElements;
+
/** Cache access count (sequential ID) */
private final AtomicLong count;
@@ -308,6 +314,8 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
this.stats = new CacheStats(this.getClass().getSimpleName());
this.count = new AtomicLong(0);
this.elements = new AtomicLong(0);
+ this.dataBlockElements = new AtomicLong(0);
+ this.dataBlockSize = new AtomicLong(0);
this.overhead = calculateOverhead(maxSize, blockSize, mapConcurrencyLevel);
this.size = new AtomicLong(this.overhead);
this.hardCapacityLimitFactor = hardLimitFactor;
@@ -393,6 +401,9 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
long newSize = updateSizeMetrics(cb, false);
map.put(cacheKey, cb);
long val = elements.incrementAndGet();
+ if (buf.getBlockType().isData()) {
+ dataBlockElements.incrementAndGet();
+ }
if (LOG.isTraceEnabled()) {
long size = map.size();
assertCounterSanity(size, val);
@@ -450,9 +461,13 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
*/
protected long updateSizeMetrics(LruCachedBlock cb, boolean evict) {
long heapsize = cb.heapSize();
+ BlockType bt = cb.getBuffer().getBlockType();
if (evict) {
heapsize *= -1;
}
+ if (bt != null && bt.isData()) {
+ dataBlockSize.addAndGet(heapsize);
+ }
return size.addAndGet(heapsize);
}
@@ -552,6 +567,9 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
long size = map.size();
assertCounterSanity(size, val);
}
+ if (block.getBuffer().getBlockType().isData()) {
+ dataBlockElements.decrementAndGet();
+ }
stats.evicted(block.getCachedTime(), block.getCacheKey().isPrimary());
if (evictedByEvictionProcess && victimHandler != null) {
if (victimHandler instanceof BucketCache) {
@@ -821,6 +839,11 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
}
@Override
+ public long getCurrentDataSize() {
+ return this.dataBlockSize.get();
+ }
+
+ @Override
public long getFreeSize() {
return getMaxSize() - getCurrentSize();
}
@@ -835,6 +858,11 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
return this.elements.get();
}
+ @Override
+ public long getDataBlockCount() {
+ return this.dataBlockElements.get();
+ }
+
EvictionThread getEvictionThread() {
return this.evictionThread;
}
@@ -946,7 +974,7 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
}
public final static long CACHE_FIXED_OVERHEAD = ClassSize.align(
- (4 * Bytes.SIZEOF_LONG) + (9 * ClassSize.REFERENCE) +
+ (4 * Bytes.SIZEOF_LONG) + (11 * ClassSize.REFERENCE) +
(6 * Bytes.SIZEOF_FLOAT) + (2 * Bytes.SIZEOF_BOOLEAN)
+ ClassSize.OBJECT);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
index 0c8e62bbab..c12a826d16 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
@@ -1122,6 +1122,11 @@ public class BucketCache implements BlockCache, HeapSize {
}
@Override
+ public long getCurrentDataSize() {
+ return size();
+ }
+
+ @Override
public long getFreeSize() {
return this.bucketAllocator.getFreeSize();
}
@@ -1132,6 +1137,11 @@ public class BucketCache implements BlockCache, HeapSize {
}
@Override
+ public long getDataBlockCount() {
+ return getBlockCount();
+ }
+
+ @Override
public long getCurrentSize() {
return this.bucketAllocator.getUsedSize();
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHeapMemoryManager.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHeapMemoryManager.java
index 0e72d0d40d..24a995ed77 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHeapMemoryManager.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHeapMemoryManager.java
@@ -596,11 +596,21 @@ public class TestHeapMemoryManager {
}
@Override
+ public long getCurrentDataSize() {
+ return 0;
+ }
+
+ @Override
public long getBlockCount() {
return 0;
}
@Override
+ public long getDataBlockCount() {
+ return 0;
+ }
+
+ @Override
public void setMaxSize(long size) {
this.maxSize = size;
}
--
2.11.0 (Apple Git-81)