diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-10-25 11:44:05 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-10-25 11:44:05 +0200 |
commit | 176ba4c24e6c3479686b60276de0301f7d7a1b2a (patch) | |
tree | f5a8eb519eb3cac066895d202cbdf5f07a177b58 | |
parent | 88978b97b607c80686eead038ba40bfbc3d6bb27 (diff) |
Control gcopts from model.
Default is now g1gc for hosted && (!prod || region=us-east-3)
4 files changed, 44 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java index 9fafe89ea54..1f6f7ad6c69 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java @@ -44,6 +44,7 @@ import java.util.logging.Logger; public class VespaDomBuilder extends VespaModelBuilder { public static final String JVMARGS_ATTRIB_NAME = "jvmargs"; + public static final String GCOPTS_ATTRIB_NAME = "gcopts"; public static final String PRELOAD_ATTRIB_NAME = "preload"; // Intended for vespa engineers public static final String MMAP_NOCORE_LIMIT = "mmap-core-limit"; // Intended for vespa engineers public static final String CORE_ON_OOM = "core-on-oom"; // Intended for vespa engineers diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java index 2cfd4b067cd..c35da58575a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java @@ -1,6 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.container.search; +import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.RegionName; import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.prelude.fastsearch.FS4ResourcePool; @@ -54,6 +56,7 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains> this.options = options; this.owningCluster = cluster; cluster.addComponent(getFS4ResourcePool()); + } private Component<?, ComponentModel> getFS4ResourcePool() { @@ -122,6 +125,15 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains> internalBuilder.heapSizeAsPercentageOfPhysicalMemory(owningCluster.getHostClusterId().isPresent() ? 17 : 60); } qsB.jvm(internalBuilder.directMemorySizeCache(totalCacheSizeMb())); + if (owningCluster.isHostedVespa()) { + if ((owningCluster.getZone().environment() != Environment.prod) || RegionName.from("us-east-3").equals(owningCluster.getZone().region())) { + qsB.jvm.gcopts("-XX:-UseConcMarkSweepGC -XX:+UseG1GC -XX:MaxTenuringThreshold=15"); + } else { + qsB.jvm.gcopts("-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"); + } + } else { + qsB.jvm.gcopts("-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"); + } } private int totalCacheSizeMb() { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index 89f2995d179..f3649361a74 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -461,6 +461,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { else { List<Container> nodes = createNodes(cluster, nodesElement, context); applyNodesTagJvmArgs(nodes, nodesElement.getAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME)); + applyNodesTagGCOpts(nodes, nodesElement.getAttribute(VespaDomBuilder.GCOPTS_ATTRIB_NAME)); applyRoutingAliasProperties(nodes, cluster); applyDefaultPreload(nodes, nodesElement); applyMemoryPercentage(cluster, nodesElement.getAttribute(VespaDomBuilder.Allocated_MEMORY_ATTRIB_NAME)); @@ -665,6 +666,12 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { container.prependJvmArgs(nodesTagJvnArgs); } } + private void applyNodesTagGCOpts(List<Container> containers, String nodesTagJvnArgs) { + for (Container container: containers) { + if (container.getAssignedJvmArgs().isEmpty()) + container.prependJvmArgs(nodesTagJvnArgs); + } + } private void applyDefaultPreload(List<Container> containers, Element nodesElement) { if (! nodesElement.hasAttribute(VespaDomBuilder.PRELOAD_ATTRIB_NAME)) return; 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 8e096b14d85..6e962146c79 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 @@ -107,6 +107,10 @@ public class ContainerClusterTest { DeployState state = new DeployState.Builder().properties(new DeployProperties.Builder().hostedVespa(isHosted).build()).build(); return new MockRoot("foo", state); } + private MockRoot createRoot(boolean isHosted, Zone zone) { + DeployState state = new DeployState.Builder().zone(zone).properties(new DeployProperties.Builder().hostedVespa(isHosted).build()).build(); + return new MockRoot("foo", state); + } private ContainerCluster createContainerCluster(MockRoot root, boolean isCombinedCluster, Integer memoryPercentage, Optional<ContainerClusterVerifier> extraComponents) { @@ -154,6 +158,7 @@ public class ContainerClusterTest { assertEquals(expectedArgs, jvmArgs); } } + private void verifyJvmArgs(boolean isHosted, boolean hasDocProc) { MockRoot root = createRoot(isHosted); ContainerCluster cluster = createContainerCluster(root, false); @@ -174,6 +179,25 @@ public class ContainerClusterTest { verifyJvmArgs(isHosted, hasDocProc, "", container.getJvmArgs()); } + private void verifyGCOpts(boolean isHosted, Zone zone, String expected) { + MockRoot root = createRoot(isHosted, zone); + ContainerCluster cluster = createContainerCluster(root, false); + addContainer(root.deployLogger(), cluster, "c1", "host-c1"); + assertEquals(1, cluster.getContainers().size()); + QrStartConfig.Builder qsB = new QrStartConfig.Builder(); + cluster.getSearch().getConfig(qsB); + QrStartConfig qsC= new QrStartConfig(qsB); + assertEquals(expected, qsC.jvm().gcopts()); + } + + @Test + public void requireThatGCOptsIsHonoured() { + verifyGCOpts(false, Zone.defaultZone(), "-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"); + verifyGCOpts(false, new Zone(Environment.prod, RegionName.from("us-east-3")), "-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"); + verifyGCOpts(true, Zone.defaultZone(), "-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"); + verifyGCOpts(true, new Zone(Environment.prod, RegionName.from("us-east-3")), "-XX:-UseConcMarkSweepGC -XX:+UseG1GC -XX:MaxTenuringThreshold=15"); + } + @Test public void testContainerClusterMaxThreads() { MockRoot root = createRoot(false); |