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 2020/01/14 06:28:32 UTC

[servicecomb-java-chassis] 01/04: [SCB-1716] Fix high cpu load when there are too many instances

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/servicecomb-java-chassis.git

commit 58e0c131b5c7e39d67790fdbabdd9fe21a9c49b3
Author: AngLi2 <li...@qq.com>
AuthorDate: Sat Jan 11 10:46:47 2020 +0800

    [SCB-1716] Fix high cpu load when there are too many instances
---
 .../loadbalance/ServiceCombLoadBalancerStats.java  | 22 +++++++++++++++-------
 .../servicecomb/loadbalance/TestLoadBalancer.java  |  5 +++++
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
index 95e23d2..bdcd0dc 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
@@ -55,6 +55,8 @@ public class ServiceCombLoadBalancerStats {
 
   private LoadingCache<ServiceCombServer, ServiceCombServerStats> serverStatsCache;
 
+  private Map<String, ServiceCombServer> serviceCombServers = new ConcurrentHashMap<>();
+
   public static ServiceCombLoadBalancerStats INSTANCE;
 
   private Timer timer;
@@ -104,6 +106,10 @@ public class ServiceCombLoadBalancerStats {
   }
 
   public ServiceCombServer getServiceCombServer(MicroserviceInstance instance) {
+    return serviceCombServers.get(instance.getInstanceId());
+  }
+
+  public ServiceCombServer getServiceCombServerOld(MicroserviceInstance instance) {
     for (ServiceCombServer server : serverStatsCache.asMap().keySet()) {
       if (server.getInstance().equals(instance)) {
         return server;
@@ -141,18 +147,20 @@ public class ServiceCombLoadBalancerStats {
     serverStatsCache =
         CacheBuilder.newBuilder()
             .expireAfterAccess(serverExpireInSeconds, TimeUnit.SECONDS)
-            .removalListener(new RemovalListener<ServiceCombServer, ServiceCombServerStats>() {
-              @Override
-              public void onRemoval(RemovalNotification<ServiceCombServer, ServiceCombServerStats> notification) {
-                LOGGER.info("stats of instance {} removed.", notification.getKey().getInstance().getInstanceId());
-                pingView.remove(notification.getKey());
-              }
-            })
+            .removalListener(
+                (RemovalListener<ServiceCombServer, ServiceCombServerStats>) notification -> {
+                  ServiceCombServer server = notification.getKey();
+                  LOGGER.info("stats of instance {} removed, host is {}",
+                      server.getInstance().getInstanceId(), server.getHost());
+                  pingView.remove(notification.getKey());
+                  serviceCombServers.remove(notification.getKey());
+                })
             .build(
                 new CacheLoader<ServiceCombServer, ServiceCombServerStats>() {
                   public ServiceCombServerStats load(ServiceCombServer server) {
                     ServiceCombServerStats stats = new ServiceCombServerStats();
                     pingView.put(server, stats);
+                    serviceCombServers.put(server.getInstance().getInstanceId(), server);
                     return stats;
                   }
                 });
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java
index 761c23c..9b5d876 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java
@@ -23,6 +23,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -35,8 +37,11 @@ public class TestLoadBalancer {
     List<ServiceCombServer> newServers = new ArrayList<>();
     ServiceCombServer server = Mockito.mock(ServiceCombServer.class);
     Invocation invocation = Mockito.mock(Invocation.class);
+    MicroserviceInstance microserviceInstance = Mockito.mock(MicroserviceInstance.class);
     newServers.add(server);
     when(invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST)).thenReturn(newServers);
+    when(server.getInstance()).thenReturn(microserviceInstance);
+    when(microserviceInstance.getInstanceId()).thenReturn("123456");
     LoadBalancer loadBalancer = new LoadBalancer(rule, "test");
     loadBalancer.chooseServer(invocation);