2017-10-18 10 views
1

私はGemfireキャッシュ内の地域のサイズを見つけようとしています。私は地域のJava APIをチェックしました。 sizeメソッドは、エントリ数だけを返します。 Gemfire Pulseのデータビューには、各地域のメモリ使用量が表示されているため、どのくらいのメモリを取っているかという観点から領域サイズを計算する方法があるはずです。誰でもこれを助けてくれますか?Gemfire地域サイズ

おかげ

答えて

1

あなたは合計ヒープ後にしている場合は、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 }

+0

おかげウィリアムズ:それは挿入時間が遅くなるため、挿入時の各列のサイズを計算しないと、仕様です。私はGFMonを手に入れました。それは地域のサイズ情報を示しています。ちなみに、私は永続的なオーバーフロー(https://stackoverflow.com/questions/46747762/gemfire-persistent-overflow)に関する別の投稿をここに掲載しています。あなたは一見を持ってもらえますか? – Biswajit

+0

私がする前に、上記の答えを確認してもらえますか?ありがとう –