diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-10-15 16:05:07 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-12-02 22:34:12 +0100 |
commit | 8e3f41c080e907cea27b58df869c9e127efdc078 (patch) | |
tree | a1fa8ebd4581881680eaf7b7532613e1107a97fa | |
parent | 610dcc8a32847c0b017e55319f2c5977004c198f (diff) |
In a hosted setting where flavour is available we now always compute absolute heap sizes.balder/hosted-always-convert-percentages-in-config-model
5 files changed, 71 insertions, 32 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 e59baf88422..7fe6e97397a 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,7 +3,6 @@ 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; @@ -40,9 +39,12 @@ public final class ApplicationContainer extends Container implements QrStartConf @Override public void getConfig(QrStartConfig.Builder builder) { - if (getHostResource() != null) { + ApplicationContainerCluster cluster = (ApplicationContainerCluster) getParent(); + if (isHostedVespa && getHostResource() != null) { if (getHostResource().getFlavor().isPresent()) { - NodeFlavorTuning flavorTuning = new NodeFlavorTuning(getHostResource().getFlavor().get()); + boolean isCombinedCluster = cluster.getHostClusterId().isPresent(); + NodeFlavorTuning flavorTuning = new NodeFlavorTuning(getHostResource().getFlavor().get(), + cluster.getMemoryPercentage().orElse(isCombinedCluster ? 17 : 60)); flavorTuning.getConfig(builder); } } 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 0bdc3fbef9a..647b6429a41 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 @@ -199,8 +199,6 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat .heapsize(1536); if (getMemoryPercentage().isPresent()) { builder.jvm.heapSizeAsPercentageOfPhysicalMemory(getMemoryPercentage().get()); - } else if (isHostedVespa()) { - builder.jvm.heapSizeAsPercentageOfPhysicalMemory(getHostClusterId().isPresent() ? 17 : 60); } } 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 index 67938b36fd9..381e0bb47f1 100644 --- 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 @@ -12,14 +12,18 @@ import com.yahoo.search.config.QrStartConfig; public class NodeFlavorTuning implements QrStartConfig.Producer { private final Flavor flavor; - - NodeFlavorTuning(Flavor flavor) { + private final double memoryFraction; + NodeFlavorTuning(Flavor flavor, double memoryPercentage) { this.flavor = flavor; + this.memoryFraction = memoryPercentage / 100; } @Override public void getConfig(QrStartConfig.Builder builder) { builder.jvm.availableProcessors(Math.max(2, (int)Math.ceil(flavor.getMinCpuCores()))); + int heapSize = (int)(memoryFraction*flavor.getMinMainMemoryAvailableGb()*1000); + builder.jvm.minHeapsize(heapSize).heapsize(heapSize); + builder.jvm.heapSizeAsPercentageOfPhysicalMemory(0); } } diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java index 93c3c9ea2ea..c4d8bddf986 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java @@ -200,7 +200,11 @@ public class ModelProvisioningTest { assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); assertEquals("Nodes in container1", 1, model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Heap size for container", 60, physicalMemoryPercentage(model.getContainerClusters().get("container1"))); + QrStartConfig qrStartConfig = qrStartConfig(model, "container1/container.0"); + assertEquals("Heap size percentage for container", 0, qrStartConfig.jvm().heapSizeAsPercentageOfPhysicalMemory()); + int expectedHeapSize = (int)(0.6 * 3.0 * 1000); + assertEquals("Heap size for container", expectedHeapSize, qrStartConfig.jvm().heapsize()); + assertEquals("Min Heap size for container", expectedHeapSize, qrStartConfig.jvm().minHeapsize()); } @Test @@ -247,8 +251,11 @@ public class ModelProvisioningTest { assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); assertEquals("Nodes in container1", 2, model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Heap size is lowered with combined clusters", - 17, physicalMemoryPercentage(model.getContainerClusters().get("container1"))); + QrStartConfig qrStartConfig = qrStartConfig(model, "container1/container.0"); + assertEquals("Heap size percentage for container", 0, qrStartConfig.jvm().heapSizeAsPercentageOfPhysicalMemory()); + int expectedHeapSize = (int)(0.17 * 3.0 * 1000); + assertEquals("Heap size for container", expectedHeapSize, qrStartConfig.jvm().heapsize()); + assertEquals("Min Heap size for container", expectedHeapSize, qrStartConfig.jvm().minHeapsize()); } @Test @@ -1641,10 +1648,10 @@ public class ModelProvisioningTest { return modelCreatorWithMockPkg.create(false, deployState); } - private int physicalMemoryPercentage(ContainerCluster cluster) { + private QrStartConfig qrStartConfig(VespaModel model, String configId) { QrStartConfig.Builder b = new QrStartConfig.Builder(); - cluster.getConfig(b); - return new QrStartConfig(b).jvm().heapSizeAsPercentageOfPhysicalMemory(); + model.getConfig(b, configId); + return new QrStartConfig(b); } @Test 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 d1c5e344c24..7b6d960d0e4 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 @@ -7,11 +7,14 @@ import com.yahoo.cloud.config.RoutingProviderConfig; 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.provision.SingleNodeProvisioner; 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.SystemName; import com.yahoo.config.provision.Zone; +import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.model.Host; @@ -85,32 +88,57 @@ public class ContainerClusterTest { return new ClusterControllerContainerCluster(root, "container0", "container1", root.getDeployState()); } private MockRoot createRoot(boolean isHosted) { - DeployState state = new DeployState.Builder().properties(new TestProperties().setHostedVespa(isHosted)).build(); + return createRoot(isHosted, new Flavor(new FlavorsConfig.Flavor.Builder() + .name("test-flavor") + .minCpuCores(9) + .minMainMemoryAvailableGb(7.0) + .build())); + } + private MockRoot createRoot(boolean isHosted, Flavor flavor) { + DeployState state = new DeployState.Builder() + .properties(new TestProperties().setHostedVespa(isHosted)) + .modelHostProvisioner(new SingleNodeProvisioner(flavor)) + .build(); return new MockRoot("foo", state); } private void verifyHeapSizeAsPercentageOfPhysicalMemory(boolean isHosted, boolean isCombinedCluster, Integer explicitMemoryPercentage, - int expectedMemoryPercentage) { - ContainerCluster cluster = createContainerCluster(createRoot(isHosted), isCombinedCluster, explicitMemoryPercentage); + int expectedMemoryPercentage, + int expectedHeapSizeMB, + int expectedMinHeapSizeMB) { + MockRoot root = createRoot(isHosted); + ApplicationContainerCluster cluster = createContainerCluster(root, isCombinedCluster, explicitMemoryPercentage); + addContainer(root, cluster, "c1", "localhost"); + cluster.prepare(root.getDeployState()); + root.freezeModelTopology(); + ApplicationContainer container = cluster.getContainers().get(0); QrStartConfig.Builder qsB = new QrStartConfig.Builder(); - cluster.getConfig(qsB); - QrStartConfig qsC= new QrStartConfig(qsB); - assertEquals(expectedMemoryPercentage, qsC.jvm().heapSizeAsPercentageOfPhysicalMemory()); + assertEquals("container0", cluster.getConfigId()); + assertEquals("container0/c1", container.getConfigId()); + root.getConfig(qsB, "container0/c1"); + QrStartConfig.Jvm jvm = new QrStartConfig(qsB).jvm(); + assertEquals(expectedMemoryPercentage, jvm.heapSizeAsPercentageOfPhysicalMemory()); + assertEquals(expectedHeapSizeMB, jvm.heapsize()); + assertEquals(expectedMinHeapSizeMB, jvm.minHeapsize()); } @Test public void requireThatHeapSizeAsPercentageOfPhysicalMemoryForHostedAndNot() { boolean hosted = true; boolean combined = true; // a cluster running on content nodes (only relevant with hosted) - verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, ! combined, null, 60); - verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, combined, null, 17); - verifyHeapSizeAsPercentageOfPhysicalMemory(! hosted, ! combined, null, 0); + int expected = (int) (0.6*7*1000); + verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, ! combined, null, 0, expected, expected); + expected = (int) (0.17*7*1000); + verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, combined, null, 0, expected, expected); + verifyHeapSizeAsPercentageOfPhysicalMemory(! hosted, ! combined, null, 0, 1536, 1536); // Explicit value overrides all defaults - verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, ! combined, 67, 67); - verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, combined, 68, 68); - verifyHeapSizeAsPercentageOfPhysicalMemory(! hosted, ! combined, 69, 69); + expected = (int) (0.67*7*1000); + verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, ! combined, 67, 0, expected, expected); + expected = (int) (0.68*7*1000); + verifyHeapSizeAsPercentageOfPhysicalMemory( hosted, combined, 68, 0, expected, expected); + verifyHeapSizeAsPercentageOfPhysicalMemory(! hosted, ! combined, 69, 69, 1536, 1536); } private void verifyJvmArgs(boolean isHosted, boolean hasDocproc, String expectedArgs, String jvmArgs) { @@ -131,7 +159,7 @@ public class ContainerClusterTest { if (hasDocProc) { cluster.setDocproc(new ContainerDocproc(cluster, null)); } - addContainer(root.deployLogger(), cluster, "c1", "host-c1"); + addContainer(root, cluster, "c1", "host-c1"); assertEquals(1, cluster.getContainers().size()); ApplicationContainer container = cluster.getContainers().get(0); verifyJvmArgs(isHosted, hasDocProc, "", container.getJvmOptions()); @@ -191,7 +219,7 @@ public class ContainerClusterTest { public void requireThatWeCanhandleNull() { MockRoot root = createRoot(false); ApplicationContainerCluster cluster = createContainerCluster(root, false); - addContainer(root.deployLogger(), cluster, "c1", "host-c1"); + addContainer(root, cluster, "c1", "host-c1"); Container container = cluster.getContainers().get(0); container.setJvmOptions(""); String empty = container.getJvmOptions(); @@ -210,10 +238,10 @@ public class ContainerClusterTest { assertFalse(config.enabled()); } - private static void addContainer(DeployLogger deployLogger, ApplicationContainerCluster cluster, String name, String hostName) { + private static void addContainer(MockRoot root, ApplicationContainerCluster cluster, String name, String hostName) { ApplicationContainer container = new ApplicationContainer(cluster, name, 0, cluster.isHostedVespa()); - container.setHostResource(new HostResource(new Host(null, hostName))); - container.initService(deployLogger); + container.setHostResource(root.getHostSystem().getHost(hostName)); + container.initService(root.getDeployState().getDeployLogger()); cluster.addContainer(container); } @@ -228,8 +256,8 @@ public class ContainerClusterTest { DeployState deployState = DeployState.createTestState(); MockRoot root = new MockRoot("foo", deployState); ApplicationContainerCluster cluster = new ApplicationContainerCluster(root, "subId", "name", deployState); - addContainer(deployState.getDeployLogger(), cluster, "c1", "host-c1"); - addContainer(deployState.getDeployLogger(), cluster, "c2", "host-c2"); + addContainer(root, cluster, "c1", "host-c1"); + addContainer(root, cluster, "c2", "host-c2"); return cluster; } |