代码之家  ›  专栏  ›  技术社区  ›  Biswajit

Gemfire区域大小[闭合]

  •  0
  • Biswajit  · 技术社区  · 8 年前

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

    2 回复  |  直到 5 年前
        1
  •  2
  •   Wes Williams    8 年前

    如果您在总堆之后,在gfsh中进行垃圾收集,它会在“GC之后”列中准确地告诉您分布式系统占用了多少内存。具体如下:

    gfsh>连接

               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;
    	}