You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/01/31 02:36:07 UTC

[incubator-servicecomb-java-chassis] branch master updated (27009c4 -> b7c8b17)

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git.


    from 27009c4  SCB-307 avoid to create unnecessary vertx context during send http response.
     new f932eee  SCB-310 replace double check by computeIfAbsent
     new d68e86a  SCB-310 vertx summary eventloop context created count
     new b7c8b17  SCB-310 rearrange perf metrics output and add eventloopContext created count output

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../demo/perf/PerfMetricsFilePublisher.java        | 80 ++++++++++++++++------
 .../main/java/io/vertx/core/impl/VertxImplEx.java  | 15 ++++
 .../servicecomb/foundation/vertx/VertxUtils.java   | 23 +++----
 .../java/io/vertx/core/impl/TestVertxImplEx.java   | 34 +++++----
 4 files changed, 103 insertions(+), 49 deletions(-)
 copy core/src/test/java/org/apache/servicecomb/core/TestEndpoint.java => foundations/foundation-vertx/src/test/java/io/vertx/core/impl/TestVertxImplEx.java (53%)

-- 
To stop receiving notification emails like this one, please contact
liubao@apache.org.

[incubator-servicecomb-java-chassis] 03/03: SCB-310 rearrange perf metrics output and add eventloopContext created count output

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit b7c8b175bcb54a20ff29e8649d7b56aa301e1fd2
Author: wujimin <wu...@huawei.com>
AuthorDate: Fri Jan 26 16:58:48 2018 +0800

    SCB-310 rearrange perf metrics output and add eventloopContext created count output
---
 .../demo/perf/PerfMetricsFilePublisher.java        | 80 ++++++++++++++++------
 1 file changed, 59 insertions(+), 21 deletions(-)

diff --git a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
index f04fdcd..1f00bc2 100644
--- a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
+++ b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.demo.perf;
 
 import java.util.Map.Entry;
 
+import org.apache.servicecomb.foundation.vertx.VertxUtils;
 import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
 import org.apache.servicecomb.metrics.common.MetricsDimension;
 import org.apache.servicecomb.metrics.common.ProducerInvocationMetric;
@@ -26,6 +27,8 @@ import org.apache.servicecomb.metrics.core.publish.DataSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import io.vertx.core.impl.VertxImplEx;
+
 public class PerfMetricsFilePublisher {
   private static final Logger LOGGER = LoggerFactory.getLogger(PerfMetricsFilePublisher.class);
 
@@ -41,6 +44,15 @@ public class PerfMetricsFilePublisher {
     StringBuilder sb = new StringBuilder();
     sb.append("\n");
 
+    collectSystemMetrics(metric, sb);
+    collectVertxMetrics(metric, sb);
+    collectConsumerMetrics(metric, sb);
+    collectProducerMetrics(metric, sb);
+
+    LOGGER.info(sb.toString());
+  }
+
+  protected void collectSystemMetrics(RegistryMetric metric, StringBuilder sb) {
     double cpu = metric.getInstanceMetric().getSystemMetric().getCpuLoad();
     // can not get cpu usage in windows, so skip this information
     if (cpu >= 0) {
@@ -48,41 +60,67 @@ public class PerfMetricsFilePublisher {
           .append((long) cpu * Runtime.getRuntime().availableProcessors())
           .append("%\n");
     }
+  }
 
-    sb.append("consumer:\n"
-        + "  total           tps             latency(ms)     name\n");
-    for (Entry<String, ConsumerInvocationMetric> entry : metric.getConsumerMetrics().entrySet()) {
-      String opName = entry.getKey();
-      sb.append(String
-          .format("  %-16d%-16d%-16.3f%s\n",
-              entry.getValue().getConsumerCall()
-                  .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(),
-              entry.getValue().getConsumerCall()
-                  .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue()
-                  .longValue(),
-              entry.getValue().getConsumerLatency().getAverage(),
-              opName));
+  protected void collectVertxMetrics(RegistryMetric metric, StringBuilder sb) {
+    sb.append("vertx:\n")
+        .append("  name       eventLoopContext-created\n");
+    for (Entry<String, VertxImplEx> entry : VertxUtils.getVertxMap().entrySet()) {
+      sb.append(String.format("  %-10s %-19d\n",
+          entry.getKey(),
+          entry.getValue().getEventLoopContextCreatedCount()));
+    }
+  }
+
+  protected void collectProducerMetrics(RegistryMetric metric, StringBuilder sb) {
+    if (metric.getProducerMetrics().isEmpty()) {
+      return;
     }
 
     sb.append("producer:\n"
-        + "  total           tps             latency(ms)     queue(ms)       execute(ms)     name\n");
+        + "  total               tps     latency(ms) queue(ms) execute(ms) name\n");
     for (Entry<String, ProducerInvocationMetric> entry : metric.getProducerMetrics().entrySet()) {
       String opName = entry.getKey();
       sb.append(
-          String.format("  %-16d%-16d%-16.3f%-16.3f%-16.3f%s\n",
-              entry.getValue().getProducerCall()
-                  .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(),
-              entry.getValue().getProducerCall()
-                  .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue()
+          String.format("  %-19d %-7d %-11.3f %-9.3f %-11.3f %s\n",
+              entry.getValue()
+                  .getProducerCall()
+                  .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL)
+                  .getValue(),
+              entry.getValue()
+                  .getProducerCall()
+                  .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL)
+                  .getValue()
                   .longValue(),
               entry.getValue().getProducerLatency().getAverage(),
               entry.getValue().getLifeTimeInQueue().getAverage(),
               entry.getValue().getExecutionTime().getAverage(),
               opName));
     }
+  }
 
-    sb.setLength(sb.length() - 1);
+  protected void collectConsumerMetrics(RegistryMetric metric, StringBuilder sb) {
+    if (metric.getConsumerMetrics().isEmpty()) {
+      return;
+    }
 
-    LOGGER.info(sb.toString());
+    sb.append("consumer:\n"
+        + "  total               tps     latency(ms) name\n");
+    for (Entry<String, ConsumerInvocationMetric> entry : metric.getConsumerMetrics().entrySet()) {
+      String opName = entry.getKey();
+      sb.append(String
+          .format("  %-19d %-7d %-11.3f %s\n",
+              entry.getValue()
+                  .getConsumerCall()
+                  .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL)
+                  .getValue(),
+              entry.getValue()
+                  .getConsumerCall()
+                  .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL)
+                  .getValue()
+                  .longValue(),
+              entry.getValue().getConsumerLatency().getAverage(),
+              opName));
+    }
   }
 }

-- 
To stop receiving notification emails like this one, please contact
liubao@apache.org.

[incubator-servicecomb-java-chassis] 02/03: SCB-310 vertx summary eventloop context created count

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit d68e86ac54f7a42d87c5bee14b4321e0304a3bfb
Author: wujimin <wu...@huawei.com>
AuthorDate: Fri Jan 26 16:56:14 2018 +0800

    SCB-310 vertx summary eventloop context created count
---
 .../main/java/io/vertx/core/impl/VertxImplEx.java  | 15 +++++++
 .../java/io/vertx/core/impl/TestVertxImplEx.java}  | 48 +++++++++++-----------
 2 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/foundations/foundation-vertx/src/main/java/io/vertx/core/impl/VertxImplEx.java b/foundations/foundation-vertx/src/main/java/io/vertx/core/impl/VertxImplEx.java
index be70aab..2020ff3 100644
--- a/foundations/foundation-vertx/src/main/java/io/vertx/core/impl/VertxImplEx.java
+++ b/foundations/foundation-vertx/src/main/java/io/vertx/core/impl/VertxImplEx.java
@@ -18,13 +18,17 @@
 package io.vertx.core.impl;
 
 import java.lang.reflect.Field;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.springframework.util.ReflectionUtils;
 import org.springframework.util.StringUtils;
 
 import io.vertx.core.VertxOptions;
+import io.vertx.core.json.JsonObject;
 
 public class VertxImplEx extends VertxImpl {
+  private AtomicLong eventLoopContextCreated = new AtomicLong();
+
   public VertxImplEx(String name, VertxOptions vertxOptions) {
     super(vertxOptions);
 
@@ -42,4 +46,15 @@ public class VertxImplEx extends VertxImpl {
     String prefix = (String) ReflectionUtils.getField(field, eventLoopThreadFactory);
     ReflectionUtils.setField(field, eventLoopThreadFactory, name + "-" + prefix);
   }
+
+  @Override
+  public EventLoopContext createEventLoopContext(String deploymentID, WorkerPool workerPool, JsonObject config,
+      ClassLoader tccl) {
+    eventLoopContextCreated.incrementAndGet();
+    return super.createEventLoopContext(deploymentID, workerPool, config, tccl);
+  }
+
+  public long getEventLoopContextCreatedCount() {
+    return eventLoopContextCreated.get();
+  }
 }
diff --git a/foundations/foundation-vertx/src/main/java/io/vertx/core/impl/VertxImplEx.java b/foundations/foundation-vertx/src/test/java/io/vertx/core/impl/TestVertxImplEx.java
similarity index 51%
copy from foundations/foundation-vertx/src/main/java/io/vertx/core/impl/VertxImplEx.java
copy to foundations/foundation-vertx/src/test/java/io/vertx/core/impl/TestVertxImplEx.java
index be70aab..733d150 100644
--- a/foundations/foundation-vertx/src/main/java/io/vertx/core/impl/VertxImplEx.java
+++ b/foundations/foundation-vertx/src/test/java/io/vertx/core/impl/TestVertxImplEx.java
@@ -14,32 +14,34 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package io.vertx.core.impl;
 
-import java.lang.reflect.Field;
-
-import org.springframework.util.ReflectionUtils;
-import org.springframework.util.StringUtils;
+import org.junit.Assert;
+import org.junit.Test;
 
 import io.vertx.core.VertxOptions;
-
-public class VertxImplEx extends VertxImpl {
-  public VertxImplEx(String name, VertxOptions vertxOptions) {
-    super(vertxOptions);
-
-    if (StringUtils.isEmpty(name)) {
-      return;
-    }
-
-    Field field = ReflectionUtils.findField(VertxImpl.class, "eventLoopThreadFactory");
-    field.setAccessible(true);
-    VertxThreadFactory eventLoopThreadFactory = (VertxThreadFactory) ReflectionUtils.getField(field, this);
-
-    field = ReflectionUtils.findField(eventLoopThreadFactory.getClass(), "prefix");
-    field.setAccessible(true);
-
-    String prefix = (String) ReflectionUtils.getField(field, eventLoopThreadFactory);
-    ReflectionUtils.setField(field, eventLoopThreadFactory, name + "-" + prefix);
+import io.vertx.core.json.JsonObject;
+import mockit.Mock;
+import mockit.MockUp;
+import mockit.Mocked;
+
+public class TestVertxImplEx {
+  @Test
+  public void testContextCreatedCount(@Mocked EventLoopContext context) {
+    new MockUp<VertxImpl>() {
+      @Mock
+      EventLoopContext createEventLoopContext(String deploymentID, WorkerPool workerPool, JsonObject config,
+          ClassLoader tccl) {
+        return context;
+      }
+    };
+
+    VertxImplEx vertx = new VertxImplEx("test", new VertxOptions());
+
+    vertx.createEventLoopContext(null, null, null, null);
+    Assert.assertEquals(1, vertx.getEventLoopContextCreatedCount());
+
+    vertx.createEventLoopContext(null, null, null, null);
+    Assert.assertEquals(2, vertx.getEventLoopContextCreatedCount());
   }
 }

-- 
To stop receiving notification emails like this one, please contact
liubao@apache.org.

[incubator-servicecomb-java-chassis] 01/03: SCB-310 replace double check by computeIfAbsent

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit f932eee312dfa8afe856df770acdd967a69557b7
Author: wujimin <wu...@huawei.com>
AuthorDate: Fri Jan 26 16:45:58 2018 +0800

    SCB-310 replace double check by computeIfAbsent
---
 .../servicecomb/foundation/vertx/VertxUtils.java   | 23 +++++++++-------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java
index 14fba7b..8a31563 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxUtils.java
@@ -21,12 +21,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.management.ManagementFactory;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 
 import javax.xml.ws.Holder;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import org.apache.servicecomb.foundation.vertx.client.ClientPoolManager;
 import org.apache.servicecomb.foundation.vertx.client.ClientVerticle;
 import org.apache.servicecomb.foundation.vertx.stream.BufferInputStream;
@@ -61,11 +61,15 @@ public final class VertxUtils {
   private static final long BLOCKED_THREAD_CHECK_INTERVAL = Long.MAX_VALUE / 2;
 
   // key为vertx实例名称,以支撑vertx功能分组
-  private static Map<String, Vertx> vertxMap = new ConcurrentHashMap<>();
+  private static Map<String, VertxImplEx> vertxMap = new ConcurrentHashMapEx<>();
 
   private VertxUtils() {
   }
 
+  public static Map<String, VertxImplEx> getVertxMap() {
+    return vertxMap;
+  }
+
   public static <T extends AbstractVerticle> void deployVerticle(Vertx vertx, Class<T> cls, int instanceCount) {
     DeploymentOptions options = new DeploymentOptions().setInstances(instanceCount);
 
@@ -106,18 +110,9 @@ public final class VertxUtils {
   }
 
   public static Vertx getOrCreateVertxByName(String name, VertxOptions vertxOptions) {
-    Vertx vertx = getVertxByName(name);
-    if (vertx == null) {
-      synchronized (VertxUtils.class) {
-        vertx = getVertxByName(name);
-        if (vertx == null) {
-          vertx = init(name, vertxOptions);
-          vertxMap.put(name, vertx);
-        }
-      }
-    }
-
-    return vertx;
+    return vertxMap.computeIfAbsent(name, vertxName -> {
+      return (VertxImplEx) init(vertxName, vertxOptions);
+    });
   }
 
   public static Vertx init(VertxOptions vertxOptions) {

-- 
To stop receiving notification emails like this one, please contact
liubao@apache.org.