diff options
author | Geir Storli <geirst@verizonmedia.com> | 2021-09-16 09:15:12 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2021-09-16 09:15:12 +0000 |
commit | e71201912bfde5477861f6b69bad783e2705fab4 (patch) | |
tree | 2748a5c9407887aad7a9180b0ecd30f8f295791f | |
parent | fb5d4c9b0ac504698f4df52b9b0257170b944450 (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.
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); |