diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-10-15 11:32:57 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-10-15 11:50:41 +0200 |
commit | ba8c3172477d9558feeeb7a1f972fcea16d782af (patch) | |
tree | 8048964daee1fec2606375c281447ec9678c4574 /config-model | |
parent | a087d4ab10da1f8a052b63ae32dc8e340f27bc77 (diff) |
Set availableProcessors so that we control how many cores the jvm see.
Diffstat (limited to 'config-model')
3 files changed, 67 insertions, 1 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java index af9c452da11..e59baf88422 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java @@ -3,9 +3,11 @@ package com.yahoo.vespa.model.container; import com.yahoo.config.model.api.container.ContainerServiceType; import com.yahoo.config.model.producer.AbstractConfigProducer; +import com.yahoo.config.provision.Flavor; import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.prelude.fastsearch.FS4ResourcePool; +import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.model.container.component.Component; /** @@ -13,7 +15,7 @@ import com.yahoo.vespa.model.container.component.Component; * * @author gjoranv */ -public final class ApplicationContainer extends Container { +public final class ApplicationContainer extends Container implements QrStartConfig.Producer { private static final String defaultHostedJVMArgs = "-XX:+UseOSErrorReporting -XX:+SuppressFatalErrorMessage"; @@ -36,6 +38,15 @@ public final class ApplicationContainer extends Container { return new Component<>(new ComponentModel(spec)); } + @Override + public void getConfig(QrStartConfig.Builder builder) { + if (getHostResource() != null) { + if (getHostResource().getFlavor().isPresent()) { + NodeFlavorTuning flavorTuning = new NodeFlavorTuning(getHostResource().getFlavor().get()); + flavorTuning.getConfig(builder); + } + } + } @Override protected ContainerServiceType myServiceType() { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java b/config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java new file mode 100644 index 00000000000..7ee57f0806c --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java @@ -0,0 +1,20 @@ +package com.yahoo.vespa.model.container; + +import com.yahoo.config.provision.Flavor; +import com.yahoo.search.config.QrStartConfig; + +/** + * Tuning of qr-start config for a container service based on the node flavor of that node. + * + * @author balder + */ +public class NodeFlavorTuning implements QrStartConfig.Producer { + private final Flavor flavor; + NodeFlavorTuning(Flavor flavor) { + this.flavor = flavor; + } + @Override + public void getConfig(QrStartConfig.Builder builder) { + builder.jvm.availableProcessors(Math.max(2, (int)Math.ceil(flavor.getMinCpuCores()))); + } +} diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java index d2a9b8172b3..d0317938d50 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java @@ -11,10 +11,14 @@ import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.model.provision.InMemoryProvisioner; +import com.yahoo.config.model.provision.SingleNodeProvisioner; import com.yahoo.config.model.test.MockApplicationPackage; +import com.yahoo.config.model.test.MockRoot; import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; +import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.container.ComponentsConfig; import com.yahoo.container.QrConfig; import com.yahoo.container.core.ChainsConfig; @@ -714,6 +718,37 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { assertEquals("KMP_SETTING=1 KMP_AFFINITY=granularity=fine,verbose,compact,1,0 ", qrStartConfig.qrs().env()); } + private void verifyAvailableprocessors(boolean isHosted, Flavor flavor, int expectProcessors) throws IOException, SAXException { + DeployState deployState = new DeployState.Builder() + .modelHostProvisioner(flavor != null ? new SingleNodeProvisioner(flavor) : new SingleNodeProvisioner()) + .properties(new TestProperties() + .setMultitenant(isHosted) + .setHostedVespa(isHosted)) + .build(); + MockRoot myRoot = new MockRoot("root", deployState); + Element clusterElem = DomBuilderTest.parse( + "<container version='1.0'>", + " <nodes>", + " <node hostalias='localhost'/>", + " </nodes>", + "</container>" + ); + + createModel(myRoot, clusterElem); + QrStartConfig.Builder qsB = new QrStartConfig.Builder(); + myRoot.getConfig(qsB, "container/container.0"); + QrStartConfig qsC= new QrStartConfig(qsB); + assertEquals(expectProcessors, qsC.jvm().availableProcessors()); + } + + @Test + public void requireThatAvailableProcessorsFollowFlavor() throws IOException, SAXException { + verifyAvailableprocessors(false, null,0); + verifyAvailableprocessors(true, null,0); + verifyAvailableprocessors(true, new Flavor(new FlavorsConfig.Flavor.Builder().name("test-flavor").minCpuCores(9).build()), 9); + verifyAvailableprocessors(true, new Flavor(new FlavorsConfig.Flavor.Builder().name("test-flavor").minCpuCores(1).build()), 2); + } + @Test public void requireThatProvidingTlsSecretOpensPort4443() { Element clusterElem = DomBuilderTest.parse( |