aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java2
-rw-r--r--storage/src/tests/common/bucket_stripe_utils_test.cpp13
-rw-r--r--storage/src/vespa/storage/common/bucket_stripe_utils.cpp17
-rw-r--r--storage/src/vespa/storage/common/bucket_stripe_utils.h5
-rw-r--r--storageserver/src/vespa/storageserver/app/distributorprocess.cpp20
5 files changed, 48 insertions, 9 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java
index b5fe4ddee41..f640af71a59 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java
@@ -52,6 +52,8 @@ public class Distributor extends ContentNode implements StorDistributormanagerCo
if (numDistributorStripesFlag == -1) {
if (getHostResource() != null) {
int cores = (int)getHostResource().realResources().vcpu();
+ // This should match the calculation used when node flavor is not available:
+ // storage/src/vespa/storage/common/bucket_stripe_utils.cpp
if (cores <= 16) {
return 1;
} else if (cores <= 64) {
diff --git a/storage/src/tests/common/bucket_stripe_utils_test.cpp b/storage/src/tests/common/bucket_stripe_utils_test.cpp
index a654c4fe83e..23f00856a30 100644
--- a/storage/src/tests/common/bucket_stripe_utils_test.cpp
+++ b/storage/src/tests/common/bucket_stripe_utils_test.cpp
@@ -5,9 +5,10 @@
#include <vespa/vespalib/gtest/gtest.h>
using document::BucketId;
+using storage::adjusted_num_stripes;
using storage::calc_num_stripe_bits;
using storage::stripe_of_bucket_key;
-using storage::adjusted_num_stripes;
+using storage::tune_num_stripes_based_on_cpu_cores;
constexpr uint8_t MUB = storage::spi::BucketLimits::MinUsedBits;
TEST(BucketStripeUtilsTest, stripe_of_bucket_key)
@@ -47,3 +48,13 @@ TEST(BucketStripeUtilsTest, max_stripe_values)
EXPECT_EQ(256, storage::MaxStripes);
}
+TEST(BucketStripeUtilsTest, num_stripes_tuned_based_on_cpu_cores)
+{
+ EXPECT_EQ(1, tune_num_stripes_based_on_cpu_cores(0));
+ EXPECT_EQ(1, tune_num_stripes_based_on_cpu_cores(1));
+ EXPECT_EQ(1, tune_num_stripes_based_on_cpu_cores(16));
+ EXPECT_EQ(2, tune_num_stripes_based_on_cpu_cores(17));
+ EXPECT_EQ(2, tune_num_stripes_based_on_cpu_cores(64));
+ EXPECT_EQ(4, tune_num_stripes_based_on_cpu_cores(65));
+}
+
diff --git a/storage/src/vespa/storage/common/bucket_stripe_utils.cpp b/storage/src/vespa/storage/common/bucket_stripe_utils.cpp
index 10667e79678..6f347a827c3 100644
--- a/storage/src/vespa/storage/common/bucket_stripe_utils.cpp
+++ b/storage/src/vespa/storage/common/bucket_stripe_utils.cpp
@@ -39,7 +39,8 @@ calc_num_stripe_bits(uint32_t n_stripes) noexcept
return result;
}
-uint32_t adjusted_num_stripes(uint32_t n_stripes) noexcept
+uint32_t
+adjusted_num_stripes(uint32_t n_stripes) noexcept
{
if (n_stripes > 1) {
if (n_stripes > MaxStripes) {
@@ -50,4 +51,18 @@ uint32_t adjusted_num_stripes(uint32_t n_stripes) noexcept
return n_stripes;
}
+uint32_t
+tune_num_stripes_based_on_cpu_cores(uint32_t cpu_cores) noexcept
+{
+ // This should match the calculation used when node flavor is available:
+ // config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java
+ if (cpu_cores <= 16) {
+ return 1;
+ } else if (cpu_cores <= 64) {
+ return 2;
+ } else {
+ return 4;
+ }
+}
+
}
diff --git a/storage/src/vespa/storage/common/bucket_stripe_utils.h b/storage/src/vespa/storage/common/bucket_stripe_utils.h
index 96f1247a09f..8a5886d554a 100644
--- a/storage/src/vespa/storage/common/bucket_stripe_utils.h
+++ b/storage/src/vespa/storage/common/bucket_stripe_utils.h
@@ -31,5 +31,10 @@ uint8_t calc_num_stripe_bits(uint32_t n_stripes) noexcept;
*/
[[nodiscard]] uint32_t adjusted_num_stripes(uint32_t n_stripes) noexcept;
+/**
+ * Tune the number of stripes based on the number of CPU cores.
+ */
+uint32_t tune_num_stripes_based_on_cpu_cores(uint32_t cpu_cores) noexcept;
+
}
diff --git a/storageserver/src/vespa/storageserver/app/distributorprocess.cpp b/storageserver/src/vespa/storageserver/app/distributorprocess.cpp
index 9b66500cef4..d1403c279d9 100644
--- a/storageserver/src/vespa/storageserver/app/distributorprocess.cpp
+++ b/storageserver/src/vespa/storageserver/app/distributorprocess.cpp
@@ -5,6 +5,7 @@
#include <vespa/storage/common/bucket_stripe_utils.h>
#include <vespa/storage/common/i_storage_chain_builder.h>
#include <vespa/storage/common/storagelink.h>
+#include <thread>
#include <vespa/log/log.h>
LOG_SETUP(".process.distributor");
@@ -36,14 +37,19 @@ DistributorProcess::shutdown()
namespace {
uint32_t
-adjusted_num_distributor_stripes(uint32_t cfg_n_stripes)
+adjusted_num_distributor_stripes(int32_t cfg_n_stripes)
{
- uint32_t adjusted_n_stripes = storage::adjusted_num_stripes(cfg_n_stripes);
- if (adjusted_n_stripes != cfg_n_stripes) {
- LOG(warning, "Configured number of distributor stripes (%u) is not valid. Adjusting to a valid value (%u)",
- cfg_n_stripes, adjusted_n_stripes);
+ if (cfg_n_stripes <= 0) {
+ uint32_t cpu_cores = std::thread::hardware_concurrency();
+ return storage::tune_num_stripes_based_on_cpu_cores(cpu_cores);
+ } else {
+ uint32_t adjusted_n_stripes = storage::adjusted_num_stripes(cfg_n_stripes);
+ if (adjusted_n_stripes != static_cast<uint32_t>(cfg_n_stripes)) {
+ LOG(warning, "Configured number of distributor stripes (%d) is not valid. Adjusting to a valid value (%u)",
+ cfg_n_stripes, adjusted_n_stripes);
+ }
+ return adjusted_n_stripes;
}
- return adjusted_n_stripes;
}
}
@@ -56,7 +62,7 @@ DistributorProcess::setupConfig(milliseconds subscribeTimeout)
auto distr_cfg = config::ConfigGetter<StorDistributormanagerConfig>::getConfig(
_configUri.getConfigId(), _configUri.getContext(), subscribeTimeout);
- _num_distributor_stripes = adjusted_num_distributor_stripes(std::max(distr_cfg->numDistributorStripes, 0));
+ _num_distributor_stripes = adjusted_num_distributor_stripes(distr_cfg->numDistributorStripes);
_distributorConfigHandler = _configSubscriber.subscribe<StorDistributormanagerConfig>(_configUri.getConfigId(), subscribeTimeout);
_visitDispatcherConfigHandler = _configSubscriber.subscribe<StorVisitordispatcherConfig>(_configUri.getConfigId(), subscribeTimeout);
Process::setupConfig(subscribeTimeout);