我正在尝试在我的Gemfire缓存中找到一个区域的大小。我已经检查过Region的java api。size方法仅返回条目计数。我确信一定有某种方法可以计算区域大小,因为Gemfire Pulse数据视图显示了每个区域的内存使用情况。有没有人能帮个忙?
发布于 2017-10-19 05:02:33
如果您在gfsh中查找总堆,执行垃圾收集,它将在"After 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();
对于复制区域,在其中一个节点上运行以下代码(所有代码均未显示为空格)。您必须遍历所有条目或对条目进行采样,以获得平均记录的大小,并将其乘以#条目。在插入时不计算每一行的大小是故意的,因为这会减慢插入时间:
/**
* Sizes numEntries of a replicated or local region, or all the entries if
* numEntries is 0.
*
* @param numberOfSamples
* Number of entries to size. If the value is 0, all the entries are
* sized.
*/
private Map<String, Long> sizeReplicatedOrLocalRegion(Region<?,?> region, long numberOfSamples) {
regionTypeInd = 1L;
Set<?> entries = region.entrySet();
regionSize = entries.size();
if (numberOfSamples == 0) {
numberOfSamples = entries.size();
} else if (numberOfSamples > regionSize) {
numberOfSamples = regionSize;
}
int count = 0;
for (Iterator<?> i = entries.iterator(); i.hasNext();) {
if (count == numberOfSamples) {
break;
}
LocalRegion.NonTXEntry entry = (LocalRegion.NonTXEntry) i.next();
RegionEntry re = entry.getRegionEntry();
dumpSizes(entry, re);
count++;
}
dumpTotalAndAverageSizes(numberOfSamples);
Map<String, Long> results = packageResults(numberOfSamples);
clearTotals();
return results;
}
private void dumpSizes(Region.Entry<?,?> entry, RegionEntry re) {
int deserializedRegionEntrySizeBefore = ReflectionObjectSizer.getInstance().sizeof(re);
int serializedValueSize = calculateSerializedValueSize(entry, re);
int deserializedKeySize = ReflectionObjectSizer.getInstance().sizeof(entry.getKey());
Object value = entry.getValue();
int deserializedValueSize;
if (value instanceof PdxInstance) {
Object actualObj = ((PdxInstance) value).getObject();
deserializedValueSize = sizeObject(actualObj);
} else {
deserializedValueSize = sizeObject(value);
}
int deserializedRegionEntrySizeAfter = ReflectionObjectSizer.getInstance().sizeof(re);
this.totalDeserializedRegionEntrySizeBefore += deserializedRegionEntrySizeBefore;
this.totalDeserializedKeySize += deserializedKeySize;
this.totalDeserializedValueSize += deserializedValueSize;
this.totalSerializedValueSize += serializedValueSize;
this.totalDeserializedRegionEntrySizeAfter += deserializedRegionEntrySizeAfter;
log("RegionEntry (key = " + re.getKey() + ") size: " + deserializedRegionEntrySizeBefore + " (serialized), "
+ deserializedRegionEntrySizeAfter + " (deserialized). Key size: " + deserializedKeySize
+ ". Value size: " + serializedValueSize + " (serialized), " + deserializedValueSize
+ "(deserialized).");
String histStats = "";
try {
histStats = histObject(re);
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log("Hist Stats=" + histStats);
}
private int calculateSerializedValueSize(Region.Entry<?,?> entry, RegionEntry re) {
Object valueInVm = re.getValue(null);
int serializedValueSize = 0;
if (valueInVm instanceof CachedDeserializable) {
// Value is a wrapper
Object cdValue = ((CachedDeserializable) valueInVm).getValue();
if (cdValue instanceof byte[]) {
// The wrapper wraps a serialized domain object
serializedValueSize = ((byte[]) cdValue).length;
} else {
// The wrapper wraps a deserialized domain object
serializedValueSize = ReflectionObjectSizer.getInstance().sizeof(cdValue);
}
} else {
// Value is a domain object
serializedValueSize = ReflectionObjectSizer.getInstance().sizeof(valueInVm);
}
return serializedValueSize;
}
private Map<String, Long> packageResults(long totalSamples) {
Map<String, Long> results = new HashMap<>();
results.put("Average RegionEntry size (serialized)", avgDeserializedRegionEntrySizeBefore);
results.put("Average RegionEntry size (deserialized)", avgDeserializedRegionEntrySizeAfter);
results.put("Average Key size", avgDeserializedKeySize);
results.put("Average Value size (serialized)", avgSerializedValueSize);
results.put("Average Value size (deserialized)", avgDeserializedValueSize);
results.put("Total RegionEntry size (serialized)", this.totalDeserializedRegionEntrySizeBefore);
results.put("Total RegionEntry size (deserialized)", this.totalDeserializedRegionEntrySizeAfter);
results.put("Total Key size", this.totalDeserializedKeySize);
results.put("Total Value size (serialized)", this.totalSerializedValueSize);
results.put("Total Value size (deserialized)", this.totalDeserializedValueSize);
results.put("_Region Type indicator", regionTypeInd);
results.put("_Total Sampled Entries", (long) totalSamples);
results.put("_Total Entries", (long) regionSize);
return results;
}
发布于 2018-11-08 02:19:59
登录到pulse并导航到以下url
http://XX.XXX.XXX.XX:7070/pulse/regionDetail.html?regionFullPath=/your-region-name
https://stackoverflow.com/questions/46818647
复制相似问题