1
我試圖在我的Gemfire緩存中查找區域的大小。我已經檢查過Region的java api。 size方法只返回條目計數。我確定必須有一些方法來計算區域大小,因爲它會佔用多少內存,因爲Gemfire Pulse數據顯示它顯示每個區域的內存使用情況。任何人都可以請幫忙嗎?Gemfire區域大小
感謝
我試圖在我的Gemfire緩存中查找區域的大小。我已經檢查過Region的java api。 size方法只返回條目計數。我確定必須有一些方法來計算區域大小,因爲它會佔用多少內存,因爲Gemfire Pulse數據顯示它顯示每個區域的內存使用情況。任何人都可以請幫忙嗎?Gemfire區域大小
感謝
如果你總堆後,在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 }
威廉姆斯感謝您的答覆。我設法得到GFMon,它顯示了區域大小信息。順便說一下,我在這裏有另一篇文章關於持久性溢出(https://stackoverflow.com/questions/46747762/gemfire-persistent-overflow)。你介意看看嗎? – Biswajit
好的。在我做之前,請您檢查以上答案?謝謝 –