diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2020-10-08 13:33:51 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2020-10-08 13:34:53 +0200 |
commit | dfa27ed9da0823152b92ed8b4f62d4d097ed136d (patch) | |
tree | bf1f41559d9962ec003423f4209e55fc1faaf17b /config-model | |
parent | 13ff65f0bb16814275f8f09b1df583301a71cd7d (diff) |
Scale size of default threadpool on node resources
Diffstat (limited to 'config-model')
7 files changed, 107 insertions, 38 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java index 9ae9a158631..0a61b5c91c6 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.model.admin; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; -import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.component.Handler; @@ -25,11 +24,6 @@ public class LogserverContainerCluster extends ContainerCluster<LogserverContain protected void doPrepare(DeployState deployState) { } @Override - public void getConfig(ThreadpoolConfig.Builder builder) { - builder.maxthreads(10); - } - - @Override public void getConfig(QrStartConfig.Builder builder) { super.getConfig(builder); builder.jvm.heapsize(384) diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java index 41d9df414ea..5cee73dff1b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.model.admin.clustercontroller; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; -import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.vespa.model.container.ContainerCluster; /** @@ -19,11 +18,6 @@ public class ClusterControllerContainerCluster extends ContainerCluster<ClusterC } @Override - public void getConfig(ThreadpoolConfig.Builder builder) { - builder.maxthreads(10); - } - - @Override protected void doPrepare(DeployState deployState) { } protected boolean messageBusEnabled() { return false; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java index fbf6dcfd5eb..4b9e1c302b7 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java @@ -28,7 +28,6 @@ import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Zone; -import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.container.jdisc.ThreadedHttpRequestHandler; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.vespa.model.VespaModel; @@ -198,11 +197,6 @@ public class MetricsProxyContainerCluster extends ContainerCluster<MetricsProxyC } } - @Override - public void getConfig(ThreadpoolConfig.Builder builder) { - builder.maxthreads(10); - } - protected boolean messageBusEnabled() { return false; } private MetricSet getAdditionalDefaultMetrics() { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java index 7822b03db08..11e74fa6136 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java @@ -10,7 +10,6 @@ import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.container.di.config.ApplicationBundlesConfig; -import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.container.handler.metrics.MetricsProxyApiConfig; import com.yahoo.container.handler.metrics.MetricsV2Handler; import com.yahoo.container.handler.metrics.PrometheusV1Handler; @@ -274,10 +273,6 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat null)))); } - @Override - public void getConfig(ThreadpoolConfig.Builder builder) { - } - public static class MbusParams { // the amount of the maxpendingbytes to process concurrently, typically 0.2 (20%) final Double maxConcurrentFactor; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java index 87e8f16f88c..6b47584908f 100755 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java @@ -17,9 +17,7 @@ import com.yahoo.container.QrSearchersConfig; import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.container.core.ApplicationMetadataConfig; import com.yahoo.container.core.document.ContainerDocumentConfig; -import com.yahoo.container.handler.ThreadPoolProvider; import com.yahoo.container.di.config.PlatformBundlesConfig; -import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.container.jdisc.JdiscBindingsConfig; import com.yahoo.container.jdisc.config.HealthMonitorConfig; import com.yahoo.container.jdisc.state.StateHandler; @@ -100,8 +98,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> DocprocConfig.Producer, ClusterInfoConfig.Producer, RoutingProviderConfig.Producer, - ConfigserverConfig.Producer, - ThreadpoolConfig.Producer + ConfigserverConfig.Producer { /** @@ -170,7 +167,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> addComponent(new StatisticsComponent()); addSimpleComponent(AccessLog.class); - addSimpleComponent(ThreadPoolProvider.class); + addComponent(new DefaultThreadpoolProvider(this, deployState)); addSimpleComponent(com.yahoo.concurrent.classlock.ClassLocking.class); addSimpleComponent(SecurityFilterInvoker.class); addSimpleComponent("com.yahoo.container.jdisc.metric.MetricConsumerProviderProvider"); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/DefaultThreadpoolProvider.java b/config-model/src/main/java/com/yahoo/vespa/model/container/DefaultThreadpoolProvider.java new file mode 100644 index 00000000000..a4ad8d33e41 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/DefaultThreadpoolProvider.java @@ -0,0 +1,52 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.container; + +import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.container.bundle.BundleInstantiationSpecification; +import com.yahoo.container.handler.ThreadPoolProvider; +import com.yahoo.container.handler.ThreadpoolConfig; +import com.yahoo.osgi.provider.model.ComponentModel; +import com.yahoo.vespa.model.container.component.SimpleComponent; + +/** + * Component definition for the jdisc default threadpool provider ({@link ThreadPoolProvider}). + * + * @author bjorncs + */ +class DefaultThreadpoolProvider extends SimpleComponent implements ThreadpoolConfig.Producer { + + private final ContainerCluster<?> cluster; + private final DeployState deployState; + + DefaultThreadpoolProvider(ContainerCluster<?> cluster, DeployState deployState) { + super(new ComponentModel( + BundleInstantiationSpecification.getFromStrings( + "default-threadpool", + ThreadPoolProvider.class.getName(), + null))); + this.cluster = cluster; + this.deployState = deployState; + } + + @Override + public void getConfig(ThreadpoolConfig.Builder builder) { + if (!(cluster instanceof ApplicationContainerCluster)) { + // Container clusters such as logserver, metricsproxy and clustercontroller + int defaultWorkerThreads = 10; + builder.maxthreads(defaultWorkerThreads); + builder.corePoolSize(defaultWorkerThreads); + builder.queueSize(0); + return; + } + + double threadPoolSizeFactor = deployState.getProperties().threadPoolSizeFactor(); + double vcpu = ContainerThreadpool.vcpu(cluster); + if (threadPoolSizeFactor <= 0 || vcpu == 0) return; + + // Configuration is currently identical to the search handler's threadpool + int workerThreads = Math.max(16, (int)Math.ceil(vcpu * threadPoolSizeFactor)); // TODO(bjorncs): reduce minimum size + builder.maxthreads(workerThreads); + builder.corePoolSize(workerThreads); + builder.queueSize((int)(workerThreads * deployState.getProperties().queueSizeFactor())); + } +} diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java index d493afd9c1f..034e3af6d3a 100755 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java @@ -4,9 +4,11 @@ package com.yahoo.vespa.model.container; import com.yahoo.cloud.config.ClusterInfoConfig; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.cloud.config.RoutingProviderConfig; +import com.yahoo.component.ComponentId; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; +import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.model.test.MockRoot; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Environment; @@ -14,6 +16,7 @@ import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.container.di.config.PlatformBundlesConfig; +import com.yahoo.container.handler.ThreadPoolProvider; import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.model.Host; @@ -33,6 +36,7 @@ import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; +import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -167,10 +171,9 @@ public class ContainerClusterTest { assertEquals(512, qrStartConfig.jvm().heapsize()); assertEquals(32, qrStartConfig.jvm().compressedClassSpaceSize()); assertEquals(0, qrStartConfig.jvm().heapSizeAsPercentageOfPhysicalMemory()); + root.freezeModelTopology(); - ThreadpoolConfig.Builder tpBuilder = new ThreadpoolConfig.Builder(); - cluster.getConfig(tpBuilder); - ThreadpoolConfig threadpoolConfig = new ThreadpoolConfig(tpBuilder); + ThreadpoolConfig threadpoolConfig = root.getConfig(ThreadpoolConfig.class, "container0/component/default-threadpool"); assertEquals(10, threadpoolConfig.maxthreads()); assertEquals(0, threadpoolConfig.queueSize()); } @@ -219,10 +222,9 @@ public class ContainerClusterTest { MockRoot root = new MockRoot("foo", state); ApplicationContainerCluster cluster = createContainerCluster(root, false); addContainer(root.deployLogger(), cluster, "c1", "host-c1"); + root.freezeModelTopology(); - ThreadpoolConfig.Builder tpBuilder = new ThreadpoolConfig.Builder(); - cluster.getConfig(tpBuilder); - ThreadpoolConfig threadpoolConfig = new ThreadpoolConfig(tpBuilder); + ThreadpoolConfig threadpoolConfig = root.getConfig(ThreadpoolConfig.class, "container0/component/default-threadpool"); assertEquals(500, threadpoolConfig.maxthreads()); assertEquals(0, threadpoolConfig.queueSize()); } @@ -232,15 +234,52 @@ public class ContainerClusterTest { MockRoot root = new MockRoot("foo"); ApplicationContainerCluster cluster = createContainerCluster(root, false); addContainer(root.deployLogger(), cluster, "c1", "host-c1"); + root.freezeModelTopology(); - ThreadpoolConfig.Builder tpBuilder = new ThreadpoolConfig.Builder(); - cluster.getConfig(tpBuilder); - ThreadpoolConfig threadpoolConfig = new ThreadpoolConfig(tpBuilder); + ThreadpoolConfig threadpoolConfig = root.getConfig(ThreadpoolConfig.class, "container0/component/default-threadpool"); assertEquals(500, threadpoolConfig.maxthreads()); assertEquals(0, threadpoolConfig.queueSize()); } @Test + public void container_cluster_has_default_threadpool_provider() { + MockRoot root = new MockRoot("foo"); + ApplicationContainerCluster cluster = createContainerCluster(root, false); + addContainer(root.deployLogger(), cluster, "c1", "host-c1"); + root.freezeModelTopology(); + + ComponentId expectedComponentId = new ComponentId("default-threadpool"); + var components = cluster.getComponentsMap(); + assertThat(components, hasKey(expectedComponentId)); + Component<?, ?> component = components.get(expectedComponentId); + assertEquals(ThreadPoolProvider.class.getName(), component.getClassId().getName()); + } + + @Test + public void config_for_default_threadpool_provider_scales_with_node_resources() { + HostProvisionerWithCustomRealResource hostProvisioner = new HostProvisionerWithCustomRealResource(); + MockRoot root = new MockRoot( + "foo", + new DeployState.Builder() + .properties(new TestProperties() + .setThreadPoolSizeFactor(4) + .setQueueSizeFactor(20)) + .applicationPackage(new MockApplicationPackage.Builder().build()) + .modelHostProvisioner(hostProvisioner) + .build()); + ApplicationContainerCluster cluster = createContainerCluster(root, false); + HostResource hostResource = new HostResource( + new Host(null, "host-c1"), + hostProvisioner.allocateHost("host-c1")); + addContainerWithHostResource(root.deployLogger(), cluster, "c1", hostResource); + root.freezeModelTopology(); + + ThreadpoolConfig threadpoolConfig = root.getConfig(ThreadpoolConfig.class, "container0/component/default-threadpool"); + assertEquals(16, threadpoolConfig.maxthreads()); + assertEquals(320, threadpoolConfig.queueSize()); + } + + @Test public void requireThatRoutingProviderIsDisabledForNonHosted() { DeployState state = new DeployState.Builder().properties(new TestProperties().setHostedVespa(false)).build(); MockRoot root = new MockRoot("foo", state); @@ -287,8 +326,12 @@ public class ContainerClusterTest { private static void addContainer(DeployLogger deployLogger, ApplicationContainerCluster cluster, String name, String hostName) { + addContainerWithHostResource(deployLogger, cluster, name, new HostResource(new Host(null, hostName))); + } + + private static void addContainerWithHostResource(DeployLogger deployLogger, ApplicationContainerCluster cluster, String name, HostResource hostResource) { ApplicationContainer container = new ApplicationContainer(cluster, name, 0, cluster.isHostedVespa()); - container.setHostResource(new HostResource(new Host(null, hostName))); + container.setHostResource(hostResource); container.initService(deployLogger); cluster.addContainer(container); } |