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
好的。在我做之前,请您检查以上答案?谢谢 –