summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-05-01 23:53:38 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-05-01 23:53:38 +0000
commit3235a27bebf407cf3a29ef5714944d9eb14ec0d6 (patch)
tree8bedf8ece14e2cfd6cf412c7f85cc1fc37ac96e0
parent026ecba2b646535c3ba6fbc0d0c95167f54a8787 (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.
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/NodeFlavorTuning.java8
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/Tuning.java7
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/search/NodeFlavorTuningTest.java19
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);
+ }
}