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

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


The following commit(s) were added to refs/heads/1.3.x by this push:
     new 8362010  SCB-2101 Fix the problem of high CPU load when there are too 
many instances. (#2018)
8362010 is described below

commit 8362010a81015f293831904d00b942fe28ec108a
Author: develpoerX <[email protected]>
AuthorDate: Mon Oct 26 21:49:06 2020 +0800

    SCB-2101 Fix the problem of high CPU load when there are too many 
instances. (#2018)
---
 .../loadbalance/ServiceCombLoadBalancerStats.java  | 25 +++++++++++++++-------
 .../servicecomb/loadbalance/TestLoadBalancer.java  |  4 ++++
 .../TestServiceCombLoadBalancerStats.java          |  2 +-
 3 files changed, 22 insertions(+), 9 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 95cbc3c..b724cf9 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
@@ -17,7 +17,6 @@
 
 package org.apache.servicecomb.loadbalance;
 
-import java.util.Iterator;
 import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -50,11 +49,13 @@ public class ServiceCombLoadBalancerStats {
   private int serverExpireInSeconds = DynamicPropertyFactory.getInstance()
       .getIntProperty(Configuration.RPOP_SERVER_EXPIRED_IN_SECONDS, 300).get();
 
-  private long timerIntervalInMilis = DynamicPropertyFactory.getInstance()
+  private long timerIntervalInMillis = DynamicPropertyFactory.getInstance()
       .getLongProperty(Configuration.RPOP_TIMER_INTERVAL_IN_MINIS, 
10000).get();
 
   private LoadingCache<ServiceCombServer, ServiceCombServerStats> 
serverStatsCache;
 
+  private Map<String, ServiceCombServer> serviceCombServers = new 
ConcurrentHashMap<>();
+
   public static final ServiceCombLoadBalancerStats INSTANCE;
 
   private Timer timer;
@@ -104,6 +105,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;
@@ -118,8 +123,8 @@ public class ServiceCombLoadBalancerStats {
   }
 
   @VisibleForTesting
-  void setTimerIntervalInMilis(int milis) {
-    this.timerIntervalInMilis = milis;
+  void setTimerIntervalInMillis(int milis) {
+    this.timerIntervalInMillis = milis;
   }
 
   @VisibleForTesting
@@ -142,8 +147,11 @@ public class ServiceCombLoadBalancerStats {
             .removalListener(new RemovalListener<ServiceCombServer, 
ServiceCombServerStats>() {
               @Override
               public void onRemoval(RemovalNotification<ServiceCombServer, 
ServiceCombServerStats> notification) {
-                LOGGER.info("stats of instance {} removed.", 
notification.getKey().getInstance().getInstanceId());
+                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(
@@ -151,6 +159,7 @@ public class ServiceCombLoadBalancerStats {
                   public ServiceCombServerStats load(ServiceCombServer server) 
{
                     ServiceCombServerStats stats = new 
ServiceCombServerStats();
                     pingView.put(server, stats);
+                    
serviceCombServers.put(server.getInstance().getInstanceId(), server);
                     return stats;
                   }
                 });
@@ -166,8 +175,8 @@ public class ServiceCombLoadBalancerStats {
           
allServers.entrySet().forEach(serviceCombServerServiceCombServerStatsEntry -> {
             ServiceCombServer server = 
serviceCombServerServiceCombServerStatsEntry.getKey();
             ServiceCombServerStats stats = 
serviceCombServerServiceCombServerStatsEntry.getValue();
-            if ((System.currentTimeMillis() - stats.getLastVisitTime() > 
timerIntervalInMilis) && !ping
-                    .ping(server.getInstance())) {
+            if ((System.currentTimeMillis() - stats.getLastVisitTime() > 
timerIntervalInMillis) && !ping
+                .ping(server.getInstance())) {
               LOGGER.info("ping mark server {} failure.", 
server.getInstance().getInstanceId());
               stats.markFailure();
             }
@@ -177,7 +186,7 @@ public class ServiceCombLoadBalancerStats {
           LOGGER.warn("LoadBalancerStatsTimer error.", e);
         }
       }
-    }, timerIntervalInMilis, timerIntervalInMilis);
+    }, timerIntervalInMillis, timerIntervalInMillis);
   }
 }
 
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..c03bc7d 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,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.servicecomb.core.Invocation;
+import 
org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -35,8 +36,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);
 
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
index faa3d89..79fec89 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
@@ -74,7 +74,7 @@ public class TestServiceCombLoadBalancerStats {
 
     ServiceCombLoadBalancerStats serviceCombLoadBalancerStats = new 
ServiceCombLoadBalancerStats();
     serviceCombLoadBalancerStats.setServerExpireInSeconds(2);
-    serviceCombLoadBalancerStats.setTimerIntervalInMilis(500);
+    serviceCombLoadBalancerStats.setTimerIntervalInMillis(500);
     serviceCombLoadBalancerStats.init();
 
     ServiceCombServer serviceCombServer = new ServiceCombServer(transport,

Reply via email to