aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-04-28 09:40:39 +0200
committerGitHub <noreply@github.com>2020-04-28 09:40:39 +0200
commite5ed3574918e8c04f2c769c31a61ef2dd44c5e1c (patch)
treea7eace90b9a3e1f406dc92bc4da3d722647f3baf
parent47c22d8e71797b4b89e98f9dc063d5a462a985d2 (diff)
parentab63bd7b1482c7e0fcfc3d1bd4d936f4267a7df1 (diff)
Merge pull request #13085 from vespa-engine/gjoranv/reduce-#threads
Limit number of threads for applications with <20 nodes.
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java15
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java15
2 files changed, 23 insertions, 7 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java
index 4d57e89fc76..40011a0dc72 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetriever.java
@@ -19,7 +19,6 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -37,16 +36,16 @@ public class ApplicationMetricsRetriever extends AbstractComponent {
private static final Logger log = Logger.getLogger(ApplicationMetricsRetriever.class.getName());
- private static final int PARALLELISM = 20;
+ static final int MAX_THREADS = 20;
static final Duration MIN_TIMEOUT = Duration.ofSeconds(60);
- private static final Duration MAX_TIMEOUT = Duration.ofSeconds(240);
+ static final Duration MAX_TIMEOUT = Duration.ofSeconds(240);
private static final int HTTP_CONNECT_TIMEOUT = 5000;
private static final int HTTP_SOCKET_TIMEOUT = 30000;
private final HttpClient httpClient = createHttpClient();
private final List<NodeMetricsClient> clients;
- private final ForkJoinPool forkJoinPool = new ForkJoinPool(PARALLELISM);
+ private final ForkJoinPool forkJoinPool;
// Non-final for testing
private Duration taskTimeout;
@@ -55,7 +54,9 @@ public class ApplicationMetricsRetriever extends AbstractComponent {
@Inject
public ApplicationMetricsRetriever(MetricsNodesConfig nodesConfig) {
clients = createNodeClients(nodesConfig);
- taskTimeout = timeout(clients.size());
+ int numThreads = Math.min(clients.size(), MAX_THREADS);
+ taskTimeout = timeout(clients.size(), numThreads);
+ forkJoinPool = new ForkJoinPool(numThreads);
}
@Override
@@ -112,8 +113,8 @@ public class ApplicationMetricsRetriever extends AbstractComponent {
.build();
}
- private static Duration timeout(int clients) {
- Duration timeout = Duration.ofSeconds(Long.max(MIN_TIMEOUT.toSeconds(), 20 * clients / PARALLELISM));
+ static Duration timeout(int clients, int numThreads) {
+ Duration timeout = Duration.ofSeconds(Long.max(MIN_TIMEOUT.toSeconds(), 20 * clients / numThreads));
return timeout.compareTo(MAX_TIMEOUT) > 0 ? MAX_TIMEOUT : timeout;
}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java
index 1f2852e3526..a74989f7af6 100644
--- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsRetrieverTest.java
@@ -11,6 +11,10 @@ import java.util.Arrays;
import java.util.concurrent.TimeoutException;
import static ai.vespa.metricsproxy.TestUtil.getFileContents;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.MAX_THREADS;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.MAX_TIMEOUT;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.MIN_TIMEOUT;
+import static ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever.timeout;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
@@ -146,6 +150,17 @@ public class ApplicationMetricsRetrieverTest {
verifyRetrievingMetricsFromSingleNode(config, node);
}
+ @Test
+ public void test_timeout_calculation() {
+ assertEquals(MIN_TIMEOUT, timeout(1, 1));
+ assertEquals(MIN_TIMEOUT, timeout(MAX_THREADS, MAX_THREADS));
+
+ // These values must be updated if the calculation in the timeout method itself is changed.
+ assertEquals(Duration.ofSeconds(100), timeout(100, MAX_THREADS));
+ assertEquals(Duration.ofSeconds(200), timeout(200, MAX_THREADS));
+ assertEquals(MAX_TIMEOUT, timeout(240, MAX_THREADS));
+ }
+
private MetricsNodesConfig nodesConfig(String... paths) {
var nodes = Arrays.stream(paths)
.map(this::nodeConfig)