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
                 {