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,