From 6e3b9c16fd2925ac0385606450378dbb19db2e25 Mon Sep 17 00:00:00 2001 From: Geir Storli Date: Thu, 11 Jul 2019 13:22:25 +0000 Subject: Reserve 1GB of memory for other processes running on the content node when calculating write filter memory limit. --- .../yahoo/vespa/model/search/NodeFlavorTuning.java | 9 +++++++++ .../vespa/model/search/NodeFlavorTuningTest.java | 23 +++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java index da193a17801..8ed18299b7b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java @@ -31,6 +31,7 @@ public class NodeFlavorTuning implements ProtonConfig.Producer { tuneSummaryReadIo(builder.summary.read); tuneSummaryCache(builder.summary.cache); tuneSearchReadIo(builder.search.mmap); + tuneWriteFilter(builder.writefilter); for (ProtonConfig.Documentdb.Builder dbb : builder.documentdb) { getConfig(dbb); } @@ -99,4 +100,12 @@ public class NodeFlavorTuning implements ProtonConfig.Producer { } } + private void tuneWriteFilter(ProtonConfig.Writefilter.Builder builder) { + // "Reserve" 1GB of memory for other processes running on the content node (config-proxy, cluster-controller, metrics-proxy) + double reservedMemoryGb = 1; + double defaultMemoryLimit = new ProtonConfig.Writefilter(new ProtonConfig.Writefilter.Builder()).memorylimit(); + double scaledMemoryLimit = ((nodeFlavor.getMinMainMemoryAvailableGb() - reservedMemoryGb) * defaultMemoryLimit) / nodeFlavor.getMinMainMemoryAvailableGb(); + builder.memorylimit(scaledMemoryLimit); + } + } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java b/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java index 7aadca4a1af..a4fac3fc9c6 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java @@ -11,7 +11,6 @@ import java.util.Arrays; import java.util.List; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static com.yahoo.vespa.model.search.NodeFlavorTuning.MB; import static com.yahoo.vespa.model.search.NodeFlavorTuning.GB; @@ -20,6 +19,8 @@ import static com.yahoo.vespa.model.search.NodeFlavorTuning.GB; */ public class NodeFlavorTuningTest { + private static double delta = 0.00001; + @Test public void require_that_hwinfo_disk_size_is_set() { ProtonConfig cfg = configFromDiskSetting(100); @@ -63,15 +64,15 @@ public class NodeFlavorTuningTest { @Test public void require_that_fast_disk_is_reflected_in_proton_config() { ProtonConfig cfg = configFromDiskSetting(true); - assertEquals(200, cfg.hwinfo().disk().writespeed(), 0.001); - assertEquals(100, cfg.hwinfo().disk().slowwritespeedlimit(), 0.001); + assertEquals(200, cfg.hwinfo().disk().writespeed(), delta); + assertEquals(100, cfg.hwinfo().disk().slowwritespeedlimit(), delta); } @Test public void require_that_slow_disk_is_reflected_in_proton_config() { ProtonConfig cfg = configFromDiskSetting(false); - assertEquals(40, cfg.hwinfo().disk().writespeed(), 0.001); - assertEquals(100, cfg.hwinfo().disk().slowwritespeedlimit(), 0.001); + assertEquals(40, cfg.hwinfo().disk().writespeed(), delta); + assertEquals(100, cfg.hwinfo().disk().slowwritespeedlimit(), delta); } @Test @@ -131,6 +132,14 @@ public class NodeFlavorTuningTest { assertSharedDisk(false, false); } + @Test + public void require_that_write_filter_memory_limit_is_scaled() { + assertWriteFilter(0.7, 8); + assertWriteFilter(0.75, 16); + assertWriteFilter(0.775, 32); + assertWriteFilter(0.7875, 64); + } + private static void assertDocumentStoreMaxFileSize(long expFileSizeBytes, int memoryGb) { assertEquals(expFileSizeBytes, configFromMemorySetting(memoryGb).summary().log().maxfilesize()); } @@ -156,6 +165,10 @@ public class NodeFlavorTuningTest { assertEquals(sharedDisk, configFromEnvironmentType(docker).hwinfo().disk().shared()); } + private static void assertWriteFilter(double expMemoryLimit, int memoryGb) { + assertEquals(expMemoryLimit, configFromMemorySetting(memoryGb).writefilter().memorylimit(), delta); + } + private static ProtonConfig configFromDiskSetting(boolean fastDisk) { return getConfig(new FlavorsConfig.Flavor.Builder(). fastDisk(fastDisk)); -- cgit v1.2.3