summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-10-25 15:55:45 +0200
committerGitHub <noreply@github.com>2018-10-25 15:55:45 +0200
commitf327a02ab8ce74b2db7f5eded2b1ad2e807e4a18 (patch)
tree06b8740a22f66e574efe7806f774447d223058ca
parent5ad84ff5345f06adb7995c42c8e6c56babb7eeea (diff)
parentaccef069897921c76559e09490fdc1447eb17a78 (diff)
Merge pull request #7449 from vespa-engine/balder/cms-occupancy-fraction
Balder/cms occupancy fraction
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java1
-rwxr-xr-xconfig-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java23
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java22
-rw-r--r--config-model/src/main/resources/schema/common.rnc1
-rw-r--r--config-model/src/main/resources/schema/containercluster.rnc1
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java61
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java35
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java41
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java2
-rwxr-xr-xcontainer-disc/src/main/sh/vespa-start-container-daemon.sh2
-rw-r--r--container-search/src/main/resources/configdefinitions/qr-start.def2
12 files changed, 160 insertions, 36 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/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
index 502df074ec4..fff339e6692 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
@@ -140,6 +140,8 @@ public final class ContainerCluster
public static final String STATE_HANDLER_CLASS = "com.yahoo.container.jdisc.state.StateHandler";
public static final String STATISTICS_HANDLER_CLASS = "com.yahoo.container.config.StatisticsRequestHandler";
public static final String SIMPLE_LINGUISTICS_PROVIDER = "com.yahoo.language.provider.SimpleLinguisticsProvider";
+ public static final String CMS = "-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1";
+ public static final String G1GC = "-XX:+UseG1GC -XX:MaxTenuringThreshold=15";
public static final String ROOT_HANDLER_BINDING = "*://*/";
@@ -181,6 +183,7 @@ public final class ContainerCluster
private Zone zone;
private String hostClusterId = null;
+ private String gcopts = null;
private Integer memoryPercentage = null;
private static class AcceptAllVerifier implements ContainerClusterVerifier {
@@ -784,6 +787,8 @@ public final class ContainerCluster
public Optional<String> getHostClusterId() { return Optional.ofNullable(hostClusterId); }
public void setMemoryPercentage(Integer memoryPercentage) { this.memoryPercentage = memoryPercentage; }
+ public void setGCOpts(String gcopts) { this.gcopts = gcopts; }
+ public Optional<String> getGCOpts() { return Optional.ofNullable(gcopts); }
/**
* Returns the percentage of host physical memory this application has specified for nodes in this cluster,
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..46fcf38b7e9 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,10 @@
// 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.config.provision.SystemName;
+import com.yahoo.config.provision.Zone;
import com.yahoo.container.bundle.BundleInstantiationSpecification;
import com.yahoo.osgi.provider.model.ComponentModel;
import com.yahoo.prelude.fastsearch.FS4ResourcePool;
@@ -26,6 +30,7 @@ import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
/**
* @author gjoranv
@@ -54,6 +59,7 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains>
this.options = options;
this.owningCluster = cluster;
cluster.addComponent(getFS4ResourcePool());
+
}
private Component<?, ComponentModel> getFS4ResourcePool() {
@@ -113,6 +119,20 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains>
if (pageTemplates!=null) pageTemplates.getConfig(builder);
}
+ private String buildGCOpts(Zone zone) {
+ Optional<String> gcopts = owningCluster.getGCOpts();
+ if (gcopts.isPresent()) {
+ return gcopts.get();
+ } else if (zone.system() == SystemName.dev) {
+ return ContainerCluster.G1GC;
+ } else if (owningCluster.isHostedVespa()) {
+ return ((zone.environment() != Environment.prod) || RegionName.from("us-east-3").equals(zone.region()))
+ ? ContainerCluster.G1GC : ContainerCluster.CMS;
+ } else {
+ return ContainerCluster.CMS;
+ }
+ }
+
@Override
public void getConfig(QrStartConfig.Builder qsB) {
QrStartConfig.Jvm.Builder internalBuilder = new QrStartConfig.Jvm.Builder();
@@ -122,6 +142,7 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains>
internalBuilder.heapSizeAsPercentageOfPhysicalMemory(owningCluster.getHostClusterId().isPresent() ? 17 : 60);
}
qsB.jvm(internalBuilder.directMemorySizeCache(totalCacheSizeMb()));
+ qsB.jvm.gcopts(buildGCOpts(owningCluster.getZone()));
}
private int totalCacheSizeMb() {
@@ -192,6 +213,6 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains>
* Struct that encapsulates qrserver options.
*/
public static class Options {
- public Map<String, QrsCache> cacheSettings = new LinkedHashMap<>();
+ Map<String, QrsCache> cacheSettings = new LinkedHashMap<>();
}
}
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..29763839dac 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
@@ -76,6 +76,8 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
+import java.util.logging.Level;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -449,6 +451,13 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
cluster.addContainers(Collections.singleton(container));
}
+ static boolean incompatibleGCOptions(String jvmargs) {
+ Pattern gcAlgorithm = Pattern.compile("-XX:[-+]Use.+GC");
+ if (gcAlgorithm.matcher(jvmargs).find()) {
+ return true;
+ }
+ return false;
+ }
private void addNodesFromXml(ContainerCluster cluster, Element containerElement, ConfigModelContext context) {
Element nodesElement = XML.getChild(containerElement, "nodes");
if (nodesElement == null) { // default single node on localhost
@@ -460,7 +469,14 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
}
else {
List<Container> nodes = createNodes(cluster, nodesElement, context);
- applyNodesTagJvmArgs(nodes, nodesElement.getAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME));
+ String jvmArgs = nodesElement.getAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME);
+ String gcopts = nodesElement.getAttribute(VespaDomBuilder.GCOPTS_ATTRIB_NAME);
+ if (incompatibleGCOptions(jvmArgs)) {
+ context.getDeployLogger().log(Level.WARNING, "You need to move out your GC related options from 'jvmargs' to 'gcopts'");
+ } else {
+ cluster.setGCOpts(gcopts);
+ }
+ applyNodesTagJvmArgs(nodes, jvmArgs);
applyRoutingAliasProperties(nodes, cluster);
applyDefaultPreload(nodes, nodesElement);
applyMemoryPercentage(cluster, nodesElement.getAttribute(VespaDomBuilder.Allocated_MEMORY_ATTRIB_NAME));
@@ -659,10 +675,10 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
return false;
}
- private void applyNodesTagJvmArgs(List<Container> containers, String nodesTagJvnArgs) {
+ private void applyNodesTagJvmArgs(List<Container> containers, String jvmArgs) {
for (Container container: containers) {
if (container.getAssignedJvmArgs().isEmpty())
- container.prependJvmArgs(nodesTagJvnArgs);
+ container.prependJvmArgs(jvmArgs);
}
}
diff --git a/config-model/src/main/resources/schema/common.rnc b/config-model/src/main/resources/schema/common.rnc
index 85963764139..6a82556f01b 100644
--- a/config-model/src/main/resources/schema/common.rnc
+++ b/config-model/src/main/resources/schema/common.rnc
@@ -2,6 +2,7 @@
service.attlist &= attribute hostalias { xsd:NCName }
service.attlist &= attribute baseport { xsd:unsignedShort }?
service.attlist &= attribute jvmargs { text }?
+service.attlist &= attribute gcopts { text }?
# preload is for internal use only
service.attlist &= attribute preload { text }?
diff --git a/config-model/src/main/resources/schema/containercluster.rnc b/config-model/src/main/resources/schema/containercluster.rnc
index 4934ce113bb..4862fdf7a50 100644
--- a/config-model/src/main/resources/schema/containercluster.rnc
+++ b/config-model/src/main/resources/schema/containercluster.rnc
@@ -211,6 +211,7 @@ DocumentApi = element document-api {
NodesOfContainerCluster = element nodes {
attribute jvmargs { text }? &
+ attribute gcopts { text }? &
attribute preload { text }? &
attribute allocated-memory { text }? &
attribute cpu-socket-affinity { xsd:boolean }? &
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 4a9a6d3dff3..839ddcecde3 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
@@ -87,7 +87,7 @@ public class ModelProvisioningTest {
" <handler id='myHandler'>" +
" <component id='injected' />" +
" </handler>" +
- " <nodes count='2' allocated-memory='45%' jvmargs='-verbosegc' preload='lib/blablamalloc.so'/>" +
+ " <nodes count='2' allocated-memory='45%' gcopts='-XX:+UseParNewGC' jvmargs='-verbosegc' preload='lib/blablamalloc.so'/>" +
"</jdisc>" +
"</services>";
String hosts ="<hosts>"
@@ -112,35 +112,38 @@ public class ModelProvisioningTest {
+ "</hosts>";
VespaModelCreatorWithMockPkg creator = new VespaModelCreatorWithMockPkg(null, services);
VespaModel model = creator.create(new DeployState.Builder().modelHostProvisioner(new InMemoryProvisioner(Hosts.readFrom(new StringReader(hosts)), true)));
- assertThat(model.getContainerClusters().get("mydisc").getContainers().size(), is(3));
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(0).getConfigId(), is("mydisc/container.0"));
- assertTrue(model.getContainerClusters().get("mydisc").getContainers().get(0).isInitialized());
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(1).getConfigId(), is("mydisc/container.1"));
- assertTrue(model.getContainerClusters().get("mydisc").getContainers().get(1).isInitialized());
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(2).getConfigId(), is("mydisc/container.2"));
- assertTrue(model.getContainerClusters().get("mydisc").getContainers().get(2).isInitialized());
-
- assertThat(model.getContainerClusters().get("mydisc2").getContainers().size(), is(2));
- assertThat(model.getContainerClusters().get("mydisc2").getContainers().get(0).getConfigId(), is("mydisc2/container.0"));
- assertTrue(model.getContainerClusters().get("mydisc2").getContainers().get(0).isInitialized());
- assertThat(model.getContainerClusters().get("mydisc2").getContainers().get(1).getConfigId(), is("mydisc2/container.1"));
- assertTrue(model.getContainerClusters().get("mydisc2").getContainers().get(1).isInitialized());
-
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(0).getJvmArgs(), is(""));
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(1).getJvmArgs(), is(""));
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(2).getJvmArgs(), is(""));
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(0).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so")));
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(1).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so")));
- assertThat(model.getContainerClusters().get("mydisc").getContainers().get(2).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so")));
- assertThat(model.getContainerClusters().get("mydisc").getMemoryPercentage(), is(Optional.empty()));
-
- assertThat(model.getContainerClusters().get("mydisc2").getContainers().get(0).getJvmArgs(), is("-verbosegc"));
- assertThat(model.getContainerClusters().get("mydisc2").getContainers().get(1).getJvmArgs(), is("-verbosegc"));
- assertThat(model.getContainerClusters().get("mydisc2").getContainers().get(0).getPreLoad(), is("lib/blablamalloc.so"));
- assertThat(model.getContainerClusters().get("mydisc2").getContainers().get(1).getPreLoad(), is("lib/blablamalloc.so"));
- assertThat(model.getContainerClusters().get("mydisc2").getMemoryPercentage(), is(Optional.of(45)));
+ ContainerCluster mydisc = model.getContainerClusters().get("mydisc");
+ ContainerCluster mydisc2 = model.getContainerClusters().get("mydisc2");
+ assertThat(mydisc.getContainers().size(), is(3));
+ assertThat(mydisc.getContainers().get(0).getConfigId(), is("mydisc/container.0"));
+ assertTrue(mydisc.getContainers().get(0).isInitialized());
+ assertThat(mydisc.getContainers().get(1).getConfigId(), is("mydisc/container.1"));
+ assertTrue(mydisc.getContainers().get(1).isInitialized());
+ assertThat(mydisc.getContainers().get(2).getConfigId(), is("mydisc/container.2"));
+ assertTrue(mydisc.getContainers().get(2).isInitialized());
+
+ assertThat(mydisc2.getContainers().size(), is(2));
+ assertThat(mydisc2.getContainers().get(0).getConfigId(), is("mydisc2/container.0"));
+ assertTrue(mydisc2.getContainers().get(0).isInitialized());
+ assertThat(mydisc2.getContainers().get(1).getConfigId(), is("mydisc2/container.1"));
+ assertTrue(mydisc2.getContainers().get(1).isInitialized());
+
+ assertThat(mydisc.getContainers().get(0).getJvmArgs(), is(""));
+ assertThat(mydisc.getContainers().get(1).getJvmArgs(), is(""));
+ assertThat(mydisc.getContainers().get(2).getJvmArgs(), is(""));
+ assertThat(mydisc.getContainers().get(0).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so")));
+ assertThat(mydisc.getContainers().get(1).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so")));
+ assertThat(mydisc.getContainers().get(2).getPreLoad(), is(getDefaults().underVespaHome("lib64/vespa/malloc/libvespamalloc.so")));
+ assertThat(mydisc.getMemoryPercentage(), is(Optional.empty()));
+
+ assertThat(mydisc2.getContainers().get(0).getJvmArgs(), is("-verbosegc"));
+ assertThat(mydisc2.getContainers().get(1).getJvmArgs(), is("-verbosegc"));
+ assertThat(mydisc2.getContainers().get(0).getPreLoad(), is("lib/blablamalloc.so"));
+ assertThat(mydisc2.getContainers().get(1).getPreLoad(), is("lib/blablamalloc.so"));
+ assertThat(mydisc2.getMemoryPercentage(), is(Optional.of(45)));
+ assertThat(mydisc2.getGCOpts(), is(Optional.of("-XX:+UseParNewGC")));
QrStartConfig.Builder qrStartBuilder = new QrStartConfig.Builder();
- model.getContainerClusters().get("mydisc2").getConfig(qrStartBuilder);
+ mydisc2.getConfig(qrStartBuilder);
QrStartConfig qrsStartConfig = new QrStartConfig(qrStartBuilder);
assertEquals(45, qrsStartConfig.jvm().heapSizeAsPercentageOfPhysicalMemory());
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..7051ffda84a 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,36 @@ public class ContainerClusterTest {
verifyJvmArgs(isHosted, hasDocProc, "", container.getJvmArgs());
}
+ private void verifyGCOpts(boolean isHosted, String override, Zone zone, String expected) {
+ MockRoot root = createRoot(isHosted, zone);
+ ContainerCluster cluster = createContainerCluster(root, false);
+ addContainer(root.deployLogger(), cluster, "c1", "host-c1");
+ cluster.setGCOpts(override);
+ 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());
+ }
+
+ private void verifyGCOpts(boolean isHosted, Zone zone, String expected) {
+ verifyGCOpts(isHosted, null, zone, expected);
+ verifyGCOpts(isHosted, "-XX:+UseG1GC", zone, "-XX:+UseG1GC");
+ Zone DEV = new Zone(SystemName.dev, zone.environment(), zone.region());
+ verifyGCOpts(isHosted, null, DEV, ContainerCluster.G1GC);
+ verifyGCOpts(isHosted, "-XX:+UseConcMarkSweepGC", DEV, "-XX:+UseConcMarkSweepGC");
+
+ }
+
+ @Test
+ public void requireThatGCOptsIsHonoured() {
+ final Zone US_EAST_3 = new Zone(Environment.prod, RegionName.from("us-east-3"));
+ verifyGCOpts(false, Zone.defaultZone(),ContainerCluster.CMS);
+ verifyGCOpts(false, US_EAST_3, ContainerCluster.CMS);
+ verifyGCOpts(true, Zone.defaultZone(), ContainerCluster.CMS);
+ verifyGCOpts(true, US_EAST_3, ContainerCluster.G1GC);
+ }
+
@Test
public void testContainerClusterMaxThreads() {
MockRoot root = createRoot(false);
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 f94ebab42a9..5d708dcddf4 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
@@ -28,6 +28,7 @@ import com.yahoo.container.usability.BindingsOverviewHandler;
import com.yahoo.jdisc.http.ServletPathsConfig;
import com.yahoo.net.HostName;
import com.yahoo.prelude.cluster.QrMonitorConfig;
+import com.yahoo.search.config.QrStartConfig;
import com.yahoo.vespa.model.AbstractService;
import com.yahoo.vespa.model.VespaModel;
import com.yahoo.vespa.model.container.Container;
@@ -68,6 +69,46 @@ import static org.junit.Assert.fail;
public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase {
@Test
+ public void detect_conflicting_gcoptions_in_jvmargs() {
+ assertFalse(ContainerModelBuilder.incompatibleGCOptions(""));
+ assertFalse(ContainerModelBuilder.incompatibleGCOptions("UseG1GC"));
+ assertTrue(ContainerModelBuilder.incompatibleGCOptions("-XX:+UseG1GC"));
+ assertTrue(ContainerModelBuilder.incompatibleGCOptions("abc -XX:+UseParNewGC xyz"));
+ }
+
+ @Test
+ public void honours_gcopts() {
+ Element clusterElem = DomBuilderTest.parse(
+ "<jdisc version='1.0'>",
+ " <search/>",
+ " <nodes gcopts='-XX:+UseG1GC'>",
+ " <node hostalias='mockhost'/>",
+ " </nodes>",
+ "</jdisc>" );
+ createModel(root, clusterElem);
+ QrStartConfig.Builder qrStartBuilder = new QrStartConfig.Builder();
+ root.getConfig(qrStartBuilder, "jdisc/container.0");
+ QrStartConfig qrStartConfig = new QrStartConfig(qrStartBuilder);
+ assertEquals("-XX:+UseG1GC", qrStartConfig.jvm().gcopts());
+ }
+
+ @Test
+ public void ignores_gcopts_on_conflicting_jvargs() {
+ Element clusterElem = DomBuilderTest.parse(
+ "<jdisc version='1.0'>",
+ " <search/>",
+ " <nodes gcopts='-XX:+UseG1GC' jvmargs='-XX:+UseParNewGC'>",
+ " <node hostalias='mockhost'/>",
+ " </nodes>",
+ "</jdisc>" );
+ createModel(root, clusterElem);
+ QrStartConfig.Builder qrStartBuilder = new QrStartConfig.Builder();
+ root.getConfig(qrStartBuilder, "jdisc/container.0");
+ QrStartConfig qrStartConfig = new QrStartConfig(qrStartBuilder);
+ assertEquals(ContainerCluster.CMS, qrStartConfig.jvm().gcopts());
+ }
+
+ @Test
public void default_port_is_4080() throws Exception {
Element clusterElem = DomBuilderTest.parse(
"<jdisc version='1.0'>",
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java
index f4d3fbc782c..5acfe9312f6 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java
@@ -217,7 +217,7 @@ public class DocprocBuilderTest extends DomBuilderTest {
QrStartConfig.Jvm jvm = qrStartConfig.jvm();
assertThat(jvm.server(), is(true));
assertThat(jvm.verbosegc(), is(true));
- assertThat(jvm.gcopts(), is(""));
+ assertThat(jvm.gcopts(), is("-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"));
assertThat(jvm.heapsize(), is(1536));
assertThat(jvm.stacksize(), is(512));
assertThat(qrStartConfig.ulimitv(), is(""));
diff --git a/container-disc/src/main/sh/vespa-start-container-daemon.sh b/container-disc/src/main/sh/vespa-start-container-daemon.sh
index 69c8c03ad4e..21c9dc28022 100755
--- a/container-disc/src/main/sh/vespa-start-container-daemon.sh
+++ b/container-disc/src/main/sh/vespa-start-container-daemon.sh
@@ -115,7 +115,7 @@ configure_numactl() {
}
configure_gcopts() {
- consider_fallback jvm_gcopts "-XX:+UseG1GC -XX:MaxTenuringThreshold=15"
+ consider_fallback jvm_gcopts "-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1"
if [ "$jvm_verbosegc" = "true" ]; then
jvm_gcopts="${jvm_gcopts} -verbose:gc"
fi
diff --git a/container-search/src/main/resources/configdefinitions/qr-start.def b/container-search/src/main/resources/configdefinitions/qr-start.def
index 948f360ea63..d29ebc8a826 100644
--- a/container-search/src/main/resources/configdefinitions/qr-start.def
+++ b/container-search/src/main/resources/configdefinitions/qr-start.def
@@ -9,7 +9,7 @@ jvm.server bool default=true restart
jvm.verbosegc bool default=true restart
## Garbage Collection tuning parameters
-jvm.gcopts string default="" restart
+jvm.gcopts string default="-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:NewRatio=1" restart
## Heap size (in megabytes) for the Java VM
jvm.heapsize int default=1536 restart