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);