2017-10-18 68 views
1

我试图在我的Gemfire缓存中查找区域的大小。我已经检查过Region的java api。 size方法只返回条目计数。我确定必须有一些方法来计算区域大小,因为它会占用多少内存,因为Gemfire Pulse数据显示它显示每个区域的内存使用情况。任何人都可以请帮忙吗?Gemfire区域大小

感谢

回答

1

如果你总堆后,在gfsh,做一个垃圾收集,它会告诉你你的分布式系统中究竟有多少记忆中的“GC后”一栏服用。具体如下:

gfsh>连接 gfsh> GC

  Member ID/Name    | HeapSize (MB) Before GC | HeapSize(MB) After GC | Time Taken for GC in ms 
 
------------------------------------- | ----------------------- | --------------------- | ----------------------- 
 
192.168.0.10(server1:40981)<v1>:52393 | 1698     | 120     | 14 
 
192.168.0.10(server2:43759)<v2>:9599 | 2250     | 78     | 15

为了得到一个划分区域的大小,所有的节点上运行的功能如下:

Region<?,?> primaryDataSet = PartitionRegionHelper.getLocalData(region); 
 
regionSize = primaryDataSet.size();

对于复制区域,请在其中一个节点上运行以下代码(所有代码均未显示空格)。您必须遍历全部或一系列条目以获取平均记录的大小并将其乘以#条目。不计算在插入每一行的大小是由设计,因为它会减慢插入时间:

\t /** 
 
\t * Sizes numEntries of a replicated or local region, or all the entries if 
 
\t * numEntries is 0. 
 
\t * 
 
\t * @param numberOfSamples 
 
\t *   Number of entries to size. If the value is 0, all the entries are 
 
\t *   sized. 
 
\t */ 
 
\t private Map<String, Long> sizeReplicatedOrLocalRegion(Region<?,?> region, long numberOfSamples) { 
 
\t \t regionTypeInd = 1L; 
 
\t \t Set<?> entries = region.entrySet(); 
 
\t \t regionSize = entries.size(); 
 
\t \t if (numberOfSamples == 0) { 
 
\t \t \t numberOfSamples = entries.size(); 
 
\t \t } else if (numberOfSamples > regionSize) { 
 
\t \t \t numberOfSamples = regionSize; 
 
\t \t } 
 

 
\t \t int count = 0; 
 
\t \t for (Iterator<?> i = entries.iterator(); i.hasNext();) { 
 
\t \t \t if (count == numberOfSamples) { 
 
\t \t \t \t break; 
 
\t \t \t } 
 
\t \t \t LocalRegion.NonTXEntry entry = (LocalRegion.NonTXEntry) i.next(); 
 
\t \t \t RegionEntry re = entry.getRegionEntry(); 
 
\t \t \t dumpSizes(entry, re); 
 
\t \t \t count++; 
 
\t \t } 
 

 
\t \t dumpTotalAndAverageSizes(numberOfSamples); 
 
\t \t Map<String, Long> results = packageResults(numberOfSamples); 
 
\t \t clearTotals(); 
 
\t \t return results; 
 
\t } 
 

 
\t private void dumpSizes(Region.Entry<?,?> entry, RegionEntry re) { 
 
\t \t int deserializedRegionEntrySizeBefore = ReflectionObjectSizer.getInstance().sizeof(re); 
 
\t \t int serializedValueSize = calculateSerializedValueSize(entry, re); 
 
\t \t int deserializedKeySize = ReflectionObjectSizer.getInstance().sizeof(entry.getKey()); 
 
\t \t Object value = entry.getValue(); 
 
\t \t int deserializedValueSize; 
 
\t \t if (value instanceof PdxInstance) { 
 
\t \t \t Object actualObj = ((PdxInstance) value).getObject(); 
 
\t \t \t deserializedValueSize = sizeObject(actualObj); 
 
\t \t } else { 
 
\t \t \t deserializedValueSize = sizeObject(value); 
 
\t \t } 
 
\t \t int deserializedRegionEntrySizeAfter = ReflectionObjectSizer.getInstance().sizeof(re); 
 
\t \t this.totalDeserializedRegionEntrySizeBefore += deserializedRegionEntrySizeBefore; 
 
\t \t this.totalDeserializedKeySize += deserializedKeySize; 
 
\t \t this.totalDeserializedValueSize += deserializedValueSize; 
 
\t \t this.totalSerializedValueSize += serializedValueSize; 
 
\t \t this.totalDeserializedRegionEntrySizeAfter += deserializedRegionEntrySizeAfter; 
 
\t \t log("RegionEntry (key = " + re.getKey() + ") size: " + deserializedRegionEntrySizeBefore + " (serialized), " 
 
\t \t \t \t + deserializedRegionEntrySizeAfter + " (deserialized). Key size: " + deserializedKeySize 
 
\t \t \t \t + ". Value size: " + serializedValueSize + " (serialized), " + deserializedValueSize 
 
\t \t \t \t + "(deserialized)."); 
 
\t \t 
 
\t \t String histStats = ""; 
 
\t \t try { 
 
\t \t \t histStats = histObject(re); 
 
\t \t } catch (IllegalArgumentException | IllegalAccessException e) { 
 
\t \t \t // TODO Auto-generated catch block 
 
\t \t \t e.printStackTrace(); 
 
\t \t } 
 
\t \t log("Hist Stats=" + histStats); 
 
\t } 
 

 
\t private int calculateSerializedValueSize(Region.Entry<?,?> entry, RegionEntry re) { 
 
\t \t Object valueInVm = re.getValue(null); 
 
\t \t int serializedValueSize = 0; 
 
\t \t if (valueInVm instanceof CachedDeserializable) { 
 
\t \t \t // Value is a wrapper 
 
\t \t \t Object cdValue = ((CachedDeserializable) valueInVm).getValue(); 
 
\t \t \t if (cdValue instanceof byte[]) { 
 
\t \t \t \t // The wrapper wraps a serialized domain object 
 
\t \t \t \t serializedValueSize = ((byte[]) cdValue).length; 
 
\t \t \t } else { 
 
\t \t \t \t // The wrapper wraps a deserialized domain object 
 
\t \t \t \t serializedValueSize = ReflectionObjectSizer.getInstance().sizeof(cdValue); 
 
\t \t \t } 
 
\t \t } else { 
 
\t \t \t // Value is a domain object 
 
\t \t \t serializedValueSize = ReflectionObjectSizer.getInstance().sizeof(valueInVm); 
 
\t \t } 
 

 
\t \t return serializedValueSize; 
 
\t } 
 

 
\t private Map<String, Long> packageResults(long totalSamples) { 
 
\t \t Map<String, Long> results = new HashMap<>(); 
 

 
\t \t results.put("Average RegionEntry size (serialized)", avgDeserializedRegionEntrySizeBefore); 
 
\t \t results.put("Average RegionEntry size (deserialized)", avgDeserializedRegionEntrySizeAfter); 
 
\t \t results.put("Average Key size", avgDeserializedKeySize); 
 
\t \t results.put("Average Value size (serialized)", avgSerializedValueSize); 
 
\t \t results.put("Average Value size (deserialized)", avgDeserializedValueSize); 
 
\t \t results.put("Total RegionEntry size (serialized)", this.totalDeserializedRegionEntrySizeBefore); 
 
\t \t results.put("Total RegionEntry size (deserialized)", this.totalDeserializedRegionEntrySizeAfter); 
 
\t \t results.put("Total Key size", this.totalDeserializedKeySize); 
 
\t \t results.put("Total Value size (serialized)", this.totalSerializedValueSize); 
 
\t \t results.put("Total Value size (deserialized)", this.totalDeserializedValueSize); 
 
\t \t results.put("_Region Type indicator", regionTypeInd); 
 
\t \t results.put("_Total Sampled Entries", (long) totalSamples); 
 
\t \t results.put("_Total Entries", (long) regionSize); 
 

 
\t \t return results; 
 
\t }

+0

威廉姆斯感谢您的答复。我设法得到GFMon,它显示了区域大小信息。顺便说一下,我在这里有另一篇文章关于持久性溢出(https://stackoverflow.com/questions/46747762/gemfire-persistent-overflow)。你介意看看吗? – Biswajit

+0

好的。在我做之前,请您检查以上答案?谢谢 –