2017-10-18 69 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

好的。在我做之前,請您檢查以上答案?謝謝 –