You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/01/29 16:46:19 UTC
svn commit: r904523 - in
/incubator/cassandra/trunk/src/java/org/apache/cassandra:
cache/InstrumentedCache.java cache/JMXAggregatingCache.java
cache/JMXAggregatingCacheMBean.java cache/JMXInstrumentedCacheMBean.java
tools/NodeCmd.java
Author: jbellis
Date: Fri Jan 29 15:46:19 2010
New Revision: 904523
URL: http://svn.apache.org/viewvc?rev=904523&view=rev
Log:
more-efficient stat tracking for caches
patch by jbellis; reviewed by Brandon Williams for CASSANDRA-702
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/InstrumentedCache.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCache.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCacheMBean.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXInstrumentedCacheMBean.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/InstrumentedCache.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/InstrumentedCache.java?rev=904523&r1=904522&r2=904523&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/InstrumentedCache.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/InstrumentedCache.java Fri Jan 29 15:46:19 2010
@@ -1,19 +1,21 @@
package org.apache.cassandra.cache;
+import java.util.concurrent.atomic.AtomicLong;
+
import com.reardencommerce.kernel.collections.shared.evictable.ConcurrentLinkedHashMap;
-import org.apache.cassandra.utils.TimedStatsDeque;
public class InstrumentedCache<K, V>
{
private int capacity;
private final ConcurrentLinkedHashMap<K, V> map;
- private final TimedStatsDeque stats;
+ private final AtomicLong requests = new AtomicLong(0);
+ private final AtomicLong hits = new AtomicLong(0);
+ long lastRequests, lastHits;
public InstrumentedCache(int capacity)
{
this.capacity = capacity;
map = ConcurrentLinkedHashMap.create(ConcurrentLinkedHashMap.EvictionPolicy.SECOND_CHANCE, capacity);
- stats = new TimedStatsDeque(60000);
}
public void put(K key, V value)
@@ -24,7 +26,9 @@
public V get(K key)
{
V v = map.get(key);
- stats.add(v == null ? 0 : 1);
+ requests.incrementAndGet();
+ if (v != null)
+ hits.incrementAndGet();
return v;
}
@@ -49,8 +53,28 @@
return map.size();
}
- public double getHitRate()
+ public long getHits()
+ {
+ return hits.get();
+ }
+
+ public long getRequests()
+ {
+ return requests.get();
+ }
+
+ public double getRecentHitRate()
{
- return stats.mean();
+ long r = requests.get();
+ long h = hits.get();
+ try
+ {
+ return ((double)(h - lastHits)) / (r - lastRequests);
+ }
+ finally
+ {
+ lastRequests = r;
+ lastHits = h;
+ }
}
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCache.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCache.java?rev=904523&r1=904522&r2=904523&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCache.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCache.java Fri Jan 29 15:46:19 2010
@@ -1,9 +1,5 @@
package org.apache.cassandra.cache;
-import java.util.Iterator;
-
-import com.google.common.collect.AbstractIterator;
-
public class JMXAggregatingCache implements JMXAggregatingCacheMBean
{
private final Iterable<IAggregatableCacheProvider> cacheProviders;
@@ -48,13 +44,33 @@
return size;
}
- public double getHitRate()
+ public long getRequests()
+ {
+ long requests = 0;
+ for (IAggregatableCacheProvider cacheProvider : cacheProviders)
+ {
+ requests += cacheProvider.getCache().getRequests();
+ }
+ return requests;
+ }
+
+ public long getHits()
+ {
+ long hits = 0;
+ for (IAggregatableCacheProvider cacheProvider : cacheProviders)
+ {
+ hits += cacheProvider.getCache().getHits();
+ }
+ return hits;
+ }
+
+ public double getRecentHitRate()
{
int n = 0;
double rate = 0;
for (IAggregatableCacheProvider cacheProvider : cacheProviders)
{
- rate += cacheProvider.getCache().getHitRate();
+ rate += cacheProvider.getCache().getRecentHitRate();
n++;
}
return rate / n;
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCacheMBean.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCacheMBean.java?rev=904523&r1=904522&r2=904523&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCacheMBean.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXAggregatingCacheMBean.java Fri Jan 29 15:46:19 2010
@@ -5,5 +5,8 @@
public int getCapacity();
public void setCapacity(int capacity);
public int getSize();
- public double getHitRate();
+
+ public long getRequests();
+ public long getHits();
+ public double getRecentHitRate();
}
\ No newline at end of file
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXInstrumentedCacheMBean.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXInstrumentedCacheMBean.java?rev=904523&r1=904522&r2=904523&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXInstrumentedCacheMBean.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/cache/JMXInstrumentedCacheMBean.java Fri Jan 29 15:46:19 2010
@@ -5,5 +5,17 @@
public int getCapacity();
public void setCapacity(int capacity);
public int getSize();
- public double getHitRate();
+
+ /** total request count since cache creation */
+ public long getRequests();
+
+ /** total cache hit count since cache creation */
+ public long getHits();
+
+ /**
+ * hits / requests since the last time getHitRate was called. serious telemetry apps should not use this,
+ * and should instead track the deltas from getHits / getRequests themselves, since those will not be
+ * affected by multiple users calling it. Provided for convenience only.
+ */
+ public double getRecentHitRate();
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java?rev=904523&r1=904522&r2=904523&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java Fri Jan 29 15:46:19 2010
@@ -258,7 +258,7 @@
{
outs.println("\t\tKey cache capacity: " + keyCacheMBean.getCapacity());
outs.println("\t\tKey cache size: " + keyCacheMBean.getSize());
- outs.println("\t\tKey cache hit rate: " + keyCacheMBean.getHitRate());
+ outs.println("\t\tKey cache hit rate: " + keyCacheMBean.getRecentHitRate());
}
else
{
@@ -270,7 +270,7 @@
{
outs.println("\t\tRow cache capacity: " + rowCacheMBean.getCapacity());
outs.println("\t\tRow cache size: " + rowCacheMBean.getSize());
- outs.println("\t\tRow cache hit rate: " + rowCacheMBean.getHitRate());
+ outs.println("\t\tRow cache hit rate: " + rowCacheMBean.getRecentHitRate());
}
else
{