diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-01 23:53:38 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-01 23:53:38 +0000 |
commit | 3235a27bebf407cf3a29ef5714944d9eb14ec0d6 (patch) | |
tree | 8bedf8ece14e2cfd6cf412c7f85cc1fc37ac96e0 | |
parent | 026ecba2b646535c3ba6fbc0d0c95167f54a8787 (diff) |
When using multiple threads per search we will never have 100% dutycycle to to the law of Amdahl.
To be on the safe side we ensure that we have enough threads to reach full cpu utilization even with a 0% cuty cycle.
4 files changed, 36 insertions, 2 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 5d8b0b688d8..0998d583d6c 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 @@ -18,12 +18,17 @@ public class NodeFlavorTuning implements ProtonConfig.Producer { private final Flavor nodeFlavor; private final int redundancy; private final int searchableCopies; + private final int threadsPerSearch; public NodeFlavorTuning(Flavor nodeFlavor, int redundancy, int searchableCopies) { + this(nodeFlavor, redundancy, searchableCopies, 1); + } + public NodeFlavorTuning(Flavor nodeFlavor, int redundancy, int searchableCopies, int threadsPerSearch) { this.nodeFlavor = nodeFlavor; this.redundancy = redundancy; this.searchableCopies = searchableCopies; + this.threadsPerSearch = threadsPerSearch; } @Override @@ -108,8 +113,9 @@ public class NodeFlavorTuning implements ProtonConfig.Producer { private void tuneRequestThreads(ProtonConfig.Builder builder) { int numCores = (int)Math.ceil(nodeFlavor.getMinCpuCores()); - builder.numsearcherthreads(numCores); + builder.numsearcherthreads(numCores*threadsPerSearch); builder.numsummarythreads(numCores); + builder.numthreadspersearch(threadsPerSearch); } private void tuneWriteFilter(ProtonConfig.Writefilter.Builder builder) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java index a174e7c38e8..373c62c2eda 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java @@ -272,7 +272,9 @@ public class SearchNode extends AbstractService implements } if (getHostResource() != null && getHostResource().getFlavor().isPresent()) { Flavor nodeFlavor = getHostResource().getFlavor().get(); - NodeFlavorTuning nodeFlavorTuning = new NodeFlavorTuning(nodeFlavor, redundancy, searchableCopies); + NodeFlavorTuning nodeFlavorTuning = tuning.isPresent() + ? new NodeFlavorTuning(nodeFlavor, redundancy, searchableCopies, tuning.get().getNumThreadsPerSearch()) + : new NodeFlavorTuning(nodeFlavor, redundancy, searchableCopies); nodeFlavorTuning.getConfig(builder); if (tuning.isPresent()) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/Tuning.java b/config-model/src/main/java/com/yahoo/vespa/model/search/Tuning.java index f93bf6fc872..5984aad7f16 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/Tuning.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/Tuning.java @@ -406,4 +406,11 @@ public class Tuning extends AbstractConfigProducer implements ProtonConfig.Produ if (searchNode != null) searchNode.getConfig(builder); } + public int getNumThreadsPerSearch() { + if (searchNode == null) return 1; + if (searchNode.threads == null) return 1; + if (searchNode.threads.numThreadsPerSearch == null) return 1; + return searchNode.threads.numThreadsPerSearch; + } + } 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 78c6d2eacc9..023b7249939 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 @@ -73,6 +73,15 @@ public class NodeFlavorTuningTest { ProtonConfig cfg = configFromNumCoresSetting(4.5); assertEquals(5, cfg.numsearcherthreads()); assertEquals(5, cfg.numsummarythreads()); + assertEquals(1, cfg.numthreadspersearch()); + } + + @Test + public void require_that_num_search_threads_and_considers_explict_num_threads_per_search() { + ProtonConfig cfg = configFromNumCoresSetting(4.5, 3); + assertEquals(15, cfg.numsearcherthreads()); + assertEquals(5, cfg.numsummarythreads()); + assertEquals(3, cfg.numthreadspersearch()); } @Test @@ -206,6 +215,10 @@ public class NodeFlavorTuningTest { return getConfig(new FlavorsConfig.Flavor.Builder().minCpuCores(numCores)); } + private static ProtonConfig configFromNumCoresSetting(double numCores, int numThreadsPerSearch) { + return getConfig(new FlavorsConfig.Flavor.Builder().minCpuCores(numCores), new ProtonConfig.Builder(), 1, 1, numThreadsPerSearch); + } + private static ProtonConfig configFromEnvironmentType(boolean docker) { String environment = (docker ? "DOCKER_CONTAINER" : "undefined"); return getConfig(new FlavorsConfig.Flavor.Builder().environment(environment)); @@ -223,5 +236,11 @@ public class NodeFlavorTuningTest { tuning.getConfig(protonBuilder); return new ProtonConfig(protonBuilder); } + private static ProtonConfig getConfig(FlavorsConfig.Flavor.Builder flavorBuilder, ProtonConfig.Builder protonBuilder, int redundancy, int searchableCopies, int numThreadsPerSearch) { + flavorBuilder.name("my_flavor"); + NodeFlavorTuning tuning = new NodeFlavorTuning(new Flavor(new FlavorsConfig.Flavor(flavorBuilder)), redundancy, searchableCopies, numThreadsPerSearch); + tuning.getConfig(protonBuilder); + return new ProtonConfig(protonBuilder); + } } |