aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-10-15 16:05:07 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-12-02 22:34:12 +0100
commit8e3f41c080e907cea27b58df869c9e127efdc078 (patch)
treea1fa8ebd4581881680eaf7b7532613e1107a97fa
parent610dcc8a32847c0b017e55319f2c5977004c198f (diff)
In a hosted setting where flavour is available we now always compute absolute heap sizes.balder/hosted-always-convert-percentages-in-config-model
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java8
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java8
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java19
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java66
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;
}