HBASE-18532 Improve cache related stats rendered on RS UI

Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
Biju Nair 2017-08-18 17:14:54 -04:00 committed by tedyu
parent dcd3e9abf4
commit 04f114b85c
7 changed files with 85 additions and 5 deletions

View File

@ -208,11 +208,21 @@ public class MemcachedBlockCache implements BlockCache {
return 0; return 0;
} }
@Override
public long getCurrentDataSize() {
return 0;
}
@Override @Override
public long getBlockCount() { public long getBlockCount() {
return 0; return 0;
} }
@Override
public long getDataBlockCount() {
return 0;
}
@Override @Override
public Iterator<CachedBlock> iterator() { public Iterator<CachedBlock> iterator() {
return new Iterator<CachedBlock>() { return new Iterator<CachedBlock>() {

View File

@ -327,25 +327,25 @@ are combined counts. Request count is sum of hits and misses.</p>
</%if> </%if>
<tr> <tr>
<td>Count</td> <td>Count</td>
<td><% String.format("%,d", cbsbf.getCount()) %></td> <td><% String.format("%,d", bc.getBlockCount()) %></td>
<td>Count of Blocks</td> <td>Count of Blocks</td>
</tr> </tr>
<%if !bucketCache %> <%if !bucketCache %>
<tr> <tr>
<td>Count</td> <td>Count</td>
<td><% String.format("%,d", cbsbf.getDataCount()) %></td> <td><% String.format("%,d", bc.getDataBlockCount()) %></td>
<td>Count of DATA Blocks</td> <td>Count of DATA Blocks</td>
</tr> </tr>
</%if> </%if>
<tr> <tr>
<td>Size</td> <td>Size</td>
<td><% TraditionalBinaryPrefix.long2String(cbsbf.getSize(), "B", 1) %></td> <td><% TraditionalBinaryPrefix.long2String(bc.getCurrentSize(), "B", 1) %></td>
<td>Size of Blocks</td> <td>Size of Blocks</td>
</tr> </tr>
<%if !bucketCache %> <%if !bucketCache %>
<tr> <tr>
<td>Size</td> <td>Size</td>
<td><% TraditionalBinaryPrefix.long2String(cbsbf.getDataSize(), "B", 1) %></td> <td><% TraditionalBinaryPrefix.long2String(bc.getCurrentDataSize(), "B", 1) %></td>
<td>Size of DATA Blocks</td> <td>Size of DATA Blocks</td>
</tr> </tr>
</%if> </%if>

View File

@ -102,12 +102,24 @@ public interface BlockCache extends Iterable<CachedBlock> {
*/ */
long getCurrentSize(); 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. * Returns the number of blocks currently cached in the block cache.
* @return number of blocks in the cache * @return number of blocks in the cache
*/ */
long getBlockCount(); 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. * @return Iterator over the blocks in the cache.
*/ */

View File

@ -113,6 +113,11 @@ public class CombinedBlockCache implements ResizableBlockCache, HeapSize {
return lruCache.size() + l2Cache.size(); return lruCache.size() + l2Cache.size();
} }
@Override
public long getCurrentDataSize() {
return lruCache.getCurrentDataSize() + l2Cache.getCurrentDataSize();
}
@Override @Override
public long getFreeSize() { public long getFreeSize() {
return lruCache.getFreeSize() + l2Cache.getFreeSize(); return lruCache.getFreeSize() + l2Cache.getFreeSize();
@ -128,6 +133,11 @@ public class CombinedBlockCache implements ResizableBlockCache, HeapSize {
return lruCache.getBlockCount() + l2Cache.getBlockCount(); return lruCache.getBlockCount() + l2Cache.getBlockCount();
} }
@Override
public long getDataBlockCount() {
return lruCache.getDataBlockCount() + l2Cache.getDataBlockCount();
}
public static class CombinedCacheStats extends CacheStats { public static class CombinedCacheStats extends CacheStats {
private final CacheStats lruCacheStats; private final CacheStats lruCacheStats;
private final CacheStats bucketCacheStats; private final CacheStats bucketCacheStats;

View File

@ -177,9 +177,15 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
/** Current size of cache */ /** Current size of cache */
private final AtomicLong size; private final AtomicLong size;
/** Current size of data blocks */
private final AtomicLong dataBlockSize;
/** Current number of cached elements */ /** Current number of cached elements */
private final AtomicLong elements; private final AtomicLong elements;
/** Current number of cached data block elements */
private final AtomicLong dataBlockElements;
/** Cache access count (sequential ID) */ /** Cache access count (sequential ID) */
private final AtomicLong count; private final AtomicLong count;
@ -315,6 +321,8 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
this.stats = new CacheStats(this.getClass().getSimpleName()); this.stats = new CacheStats(this.getClass().getSimpleName());
this.count = new AtomicLong(0); this.count = new AtomicLong(0);
this.elements = 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.overhead = calculateOverhead(maxSize, blockSize, mapConcurrencyLevel);
this.size = new AtomicLong(this.overhead); this.size = new AtomicLong(this.overhead);
this.hardCapacityLimitFactor = hardLimitFactor; this.hardCapacityLimitFactor = hardLimitFactor;
@ -400,6 +408,9 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
long newSize = updateSizeMetrics(cb, false); long newSize = updateSizeMetrics(cb, false);
map.put(cacheKey, cb); map.put(cacheKey, cb);
long val = elements.incrementAndGet(); long val = elements.incrementAndGet();
if (buf.getBlockType().isData()) {
dataBlockElements.incrementAndGet();
}
if (LOG.isTraceEnabled()) { if (LOG.isTraceEnabled()) {
long size = map.size(); long size = map.size();
assertCounterSanity(size, val); assertCounterSanity(size, val);
@ -455,9 +466,13 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
*/ */
private long updateSizeMetrics(LruCachedBlock cb, boolean evict) { private long updateSizeMetrics(LruCachedBlock cb, boolean evict) {
long heapsize = cb.heapSize(); long heapsize = cb.heapSize();
BlockType bt = cb.getBuffer().getBlockType();
if (evict) { if (evict) {
heapsize *= -1; heapsize *= -1;
} }
if (bt != null && bt.isData()) {
dataBlockSize.addAndGet(heapsize);
}
return size.addAndGet(heapsize); return size.addAndGet(heapsize);
} }
@ -562,6 +577,9 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
long size = map.size(); long size = map.size();
assertCounterSanity(size, val); assertCounterSanity(size, val);
} }
if (block.getBuffer().getBlockType().isData()) {
dataBlockElements.decrementAndGet();
}
if (evictedByEvictionProcess) { if (evictedByEvictionProcess) {
// When the eviction of the block happened because of invalidation of HFiles, no need to // When the eviction of the block happened because of invalidation of HFiles, no need to
// update the stats counter. // update the stats counter.
@ -831,6 +849,11 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
return this.size.get(); return this.size.get();
} }
@Override
public long getCurrentDataSize() {
return this.dataBlockSize.get();
}
@Override @Override
public long getFreeSize() { public long getFreeSize() {
return getMaxSize() - getCurrentSize(); return getMaxSize() - getCurrentSize();
@ -846,6 +869,11 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
return this.elements.get(); return this.elements.get();
} }
@Override
public long getDataBlockCount() {
return this.dataBlockElements.get();
}
EvictionThread getEvictionThread() { EvictionThread getEvictionThread() {
return this.evictionThread; return this.evictionThread;
} }
@ -959,7 +987,7 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
} }
public final static long CACHE_FIXED_OVERHEAD = ClassSize.align( 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) (6 * Bytes.SIZEOF_FLOAT) + (2 * Bytes.SIZEOF_BOOLEAN)
+ ClassSize.OBJECT); + ClassSize.OBJECT);

View File

@ -1189,6 +1189,11 @@ public class BucketCache implements BlockCache, HeapSize {
return this.realCacheSize.get(); return this.realCacheSize.get();
} }
@Override
public long getCurrentDataSize() {
return size();
}
@Override @Override
public long getFreeSize() { public long getFreeSize() {
return this.bucketAllocator.getFreeSize(); return this.bucketAllocator.getFreeSize();
@ -1199,6 +1204,11 @@ public class BucketCache implements BlockCache, HeapSize {
return this.blockNumber.get(); return this.blockNumber.get();
} }
@Override
public long getDataBlockCount() {
return getBlockCount();
}
@Override @Override
public long getCurrentSize() { public long getCurrentSize() {
return this.bucketAllocator.getUsedSize(); return this.bucketAllocator.getUsedSize();

View File

@ -747,11 +747,21 @@ public class TestHeapMemoryManager {
return this.testBlockSize; return this.testBlockSize;
} }
@Override
public long getCurrentDataSize() {
return 0;
}
@Override @Override
public long getBlockCount() { public long getBlockCount() {
return 0; return 0;
} }
@Override
public long getDataBlockCount() {
return 0;
}
@Override @Override
public void setMaxSize(long size) { public void setMaxSize(long size) {
this.maxSize = size; this.maxSize = size;