You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by li...@apache.org on 2014/03/28 03:37:59 UTC

svn commit: r1582583 - /hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/PerformanceEvaluation.java

Author: liangxie
Date: Fri Mar 28 02:37:59 2014
New Revision: 1582583

URL: http://svn.apache.org/r1582583
Log:
HBASE-10788 Add 99th percentile of latency in PE (Liu Shaohui)

Modified:
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/PerformanceEvaluation.java

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/PerformanceEvaluation.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/PerformanceEvaluation.java?rev=1582583&r1=1582582&r2=1582583&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/PerformanceEvaluation.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/PerformanceEvaluation.java Fri Mar 28 02:37:59 2014
@@ -38,6 +38,9 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.yammer.metrics.core.Histogram;
+import com.yammer.metrics.core.MetricsRegistry;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
@@ -328,10 +331,10 @@ public class PerformanceEvaluation exten
           threadOpts.startRow = index * threadOpts.perClientRunRows;
           long elapsedTime = runOneClient(cmd, getConf(), threadOpts, new Status() {
             public void setStatus(final String msg) throws IOException {
-              LOG.info("client-" + Thread.currentThread().getName() + " " + msg);
+              LOG.info(msg);
             }
           });
-          LOG.info("Finished " + Thread.currentThread().getName() + " in " + elapsedTime +
+          LOG.info("Finished in " + elapsedTime +
             "ms over " + threadOpts.perClientRunRows + " rows");
           return elapsedTime;
         }
@@ -394,8 +397,8 @@ public class PerformanceEvaluation exten
 
     TableMapReduceUtil.addDependencyJars(job);
     TableMapReduceUtil.addDependencyJars(job.getConfiguration(),
-      DescriptiveStatistics.class, // commons-math
-      ObjectMapper.class);         // jackson-mapper-asl
+      Histogram.class,     // yammer metrics   
+      ObjectMapper.class); // jackson-mapper-asl
 
     TableMapReduceUtil.initCredentials(job);
 
@@ -526,9 +529,13 @@ public class PerformanceEvaluation exten
     // Below is make it so when Tests are all running in the one
     // jvm, that they each have a differently seeded Random.
     private static final Random randomSeed = new Random(System.currentTimeMillis());
+    private static final MetricsRegistry metricsRegistry = new MetricsRegistry();
+
     private static long nextRandomSeed() {
       return randomSeed.nextLong();
     }
+    private final int everyN;
+
     protected final Random rand = new Random(nextRandomSeed());
     protected final Configuration conf;
     protected final TestOptions opts;
@@ -537,6 +544,9 @@ public class PerformanceEvaluation exten
     protected HConnection connection;
     protected HTableInterface table;
 
+    private String testName;
+    private Histogram latency;
+
     /**
      * Note that all subclasses of this class must provide a public contructor
      * that has the exact same list of arguments.
@@ -545,6 +555,9 @@ public class PerformanceEvaluation exten
       this.conf = conf;
       this.opts = options;
       this.status = status;
+      this.testName = this.getClass().getSimpleName();
+      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));
+      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");
     }
 
     private String generateStatus(final int sr, final int i, final int lr) {
@@ -560,9 +573,14 @@ public class PerformanceEvaluation exten
       this.connection = HConnectionManager.createConnection(conf);
       this.table = connection.getTable(opts.tableName);
       this.table.setAutoFlush(false, true);
+      String metricName =
+          testName + "-Client-" + Thread.currentThread().getName() + "-testRowTime";
+      latency =
+          metricsRegistry.newHistogram(PerformanceEvaluation.class, metricName);
     }
 
     void testTakedown() throws IOException {
+      reportLatency();
       if (opts.flushCommits) {
         this.table.flushCommits();
       }
@@ -594,12 +612,30 @@ public class PerformanceEvaluation exten
       int lastRow = opts.startRow + opts.perClientRunRows;
       // Report on completion of 1/10th of total.
       for (int i = opts.startRow; i < lastRow; i++) {
+        if (i % everyN != 0) continue;
+        long startTime = System.currentTimeMillis();
         testRow(i);
+        latency.update(System.currentTimeMillis() - startTime);
         if (status != null && i > 0 && (i % getReportingPeriod()) == 0) {
           status.setStatus(generateStatus(opts.startRow, i, lastRow));
         }
       }
     }
+    /**
+     * report percentiles of latency
+     * @throws IOException
+     */
+    private void reportLatency() throws IOException {
+      status.setStatus(testName + " latency log (ms), on " + latency.count() + " measures");
+      status.setStatus(testName + " Min    = " + latency.min());
+      status.setStatus(testName + " Avg    = " + latency.mean());
+      status.setStatus(testName + " StdDev = " + latency.stdDev());
+      status.setStatus(testName + " 50th   = " + latency.getSnapshot().getMedian());
+      status.setStatus(testName + " 95th   = " + latency.getSnapshot().get95thPercentile());
+      status.setStatus(testName + " 99th   = " + latency.getSnapshot().get99thPercentile());
+      status.setStatus(testName + " 99.9th = " + latency.getSnapshot().get999thPercentile());
+      status.setStatus(testName + " Max    = " + latency.max());
+    }
 
     /*
     * Test for individual row.
@@ -719,48 +755,29 @@ public class PerformanceEvaluation exten
   }
 
   static class RandomReadTest extends Test {
-    private final int everyN;
-    private final double[] times;
     private ArrayList<Get> gets;
     int idx = 0;
 
     RandomReadTest(Configuration conf, TestOptions options, Status status) {
       super(conf, options, status);
-      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));
-      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");
       if (opts.multiGet > 0) {
         LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");
         this.gets = new ArrayList<Get>(opts.multiGet);
       }
-      if (opts.reportLatency) {
-        this.times = new double[(int) Math.ceil(opts.perClientRunRows * opts.sampleRate / Math.max(1, opts.multiGet))];
-      } else {
-        this.times = null;
-      }
     }
 
     @Override
     void testRow(final int i) throws IOException {
-      if (i % everyN == 0) {
-        Get get = new Get(getRandomRow(this.rand, opts.totalRows));
-        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);
-        if (opts.multiGet > 0) {
-          this.gets.add(get);
-          if (this.gets.size() == opts.multiGet) {
-            long start = System.nanoTime();
-            this.table.get(this.gets);
-            if (opts.reportLatency) {
-              times[idx++] = (System.nanoTime() - start) / 1e6;
-            }
-            this.gets.clear();
-          }
-        } else {
-          long start = System.nanoTime();
-          this.table.get(get);
-          if (opts.reportLatency) {
-            times[idx++] = (System.nanoTime() - start) / 1e6;
-          }
+      Get get = new Get(getRandomRow(this.rand, opts.totalRows));
+      get.addColumn(FAMILY_NAME, QUALIFIER_NAME);
+      if (opts.multiGet > 0) {
+        this.gets.add(get);
+        if (this.gets.size() == opts.multiGet) {
+          this.table.get(this.gets);
+          this.gets.clear();
         }
+      } else {
+        this.table.get(get);
       }
     }
 
@@ -777,24 +794,6 @@ public class PerformanceEvaluation exten
         this.gets.clear();
       }
       super.testTakedown();
-      if (opts.reportLatency) {
-        Arrays.sort(times);
-        DescriptiveStatistics ds = new DescriptiveStatistics();
-        for (double t : times) {
-          ds.addValue(t);
-        }
-        LOG.info("randomRead latency log (ms), on " + times.length + " measures");
-        LOG.info("99.9999% = " + ds.getPercentile(99.9999d));
-        LOG.info(" 99.999% = " + ds.getPercentile(99.999d));
-        LOG.info("  99.99% = " + ds.getPercentile(99.99d));
-        LOG.info("   99.9% = " + ds.getPercentile(99.9d));
-        LOG.info("     99% = " + ds.getPercentile(99d));
-        LOG.info("     95% = " + ds.getPercentile(95d));
-        LOG.info("     90% = " + ds.getPercentile(90d));
-        LOG.info("     80% = " + ds.getPercentile(80d));
-        LOG.info("Standard Deviation = " + ds.getStandardDeviation());
-        LOG.info("Mean = " + ds.getMean());
-      }
     }
   }