首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gemfire区域大小

Gemfire区域大小
EN

Stack Overflow用户
提问于 2017-10-19 04:24:38
回答 2查看 614关注 0票数 0

我正在尝试在我的Gemfire缓存中找到一个区域的大小。我已经检查过Region的java api。size方法仅返回条目计数。我确信一定有某种方法可以计算区域大小,因为Gemfire Pulse数据视图显示了每个区域的内存使用情况。有没有人能帮个忙?

EN

回答 2

Stack Overflow用户

发布于 2017-10-19 05:02:33

如果您在gfsh中查找总堆,执行垃圾收集,它将在"After GC“列中准确地告诉您分布式系统占用了多少内存。如下所示:

gfsh>连接gfsh> gc

代码语言:javascript
复制
           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

要获取分区区域的大小,请在所有节点上的函数中运行以下命令:

代码语言:javascript
复制
Region<?,?> primaryDataSet = PartitionRegionHelper.getLocalData(region);
regionSize = primaryDataSet.size();

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

代码语言:javascript
复制
	/**
	 * 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;
	}

票数 2
EN

Stack Overflow用户

发布于 2018-11-08 02:19:59

登录到pulse并导航到以下url

http://XX.XXX.XXX.XX:7070/pulse/regionDetail.html?regionFullPath=/your-region-name

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46818647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档