summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2021-09-16 09:15:12 +0000
committerGeir Storli <geirst@verizonmedia.com>2021-09-16 09:15:12 +0000
commite71201912bfde5477861f6b69bad783e2705fab4 (patch)
tree2748a5c9407887aad7a9180b0ecd30f8f295791f
parentfb5d4c9b0ac504698f4df52b9b0257170b944450 (diff)
Flip to always use the new distributor stripe code path.
If the number of stripes is not configured, we tune it based on the sampled number of CPU cores.
-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);