diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-04-27 15:17:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-27 15:17:50 +0200 |
commit | f5dd3cb5d31875cf596adc01f2207f690afe553f (patch) | |
tree | 7878a5b47478c397a9839e4469db937fcaef1325 /searchcore | |
parent | 8cf2f720a10e3d06c69fd43a6fdfab1a59274036 (diff) | |
parent | 81cfbfe7979c3fa9d635135a06a4831101538840 (diff) |
Merge pull request #26852 from vespa-engine/balder/cap-initialize-thread-pool-at-num-cores
Cap the initialize thread pool at number of cores
Diffstat (limited to 'searchcore')
4 files changed, 26 insertions, 8 deletions
diff --git a/searchcore/src/tests/proton/server/initialize_threads_calculator/initialize_threads_calculator_test.cpp b/searchcore/src/tests/proton/server/initialize_threads_calculator/initialize_threads_calculator_test.cpp index 7aad69076ca..fc899f3a8c7 100644 --- a/searchcore/src/tests/proton/server/initialize_threads_calculator/initialize_threads_calculator_test.cpp +++ b/searchcore/src/tests/proton/server/initialize_threads_calculator/initialize_threads_calculator_test.cpp @@ -16,7 +16,8 @@ public: void expect_successful_init(uint32_t exp_threads) { - InitializeThreadsCalculator i("tmp", 9); + constexpr uint32_t cfg_threads = 9; + InitializeThreadsCalculator i(HwInfo::Cpu(cfg_threads), "tmp", cfg_threads); EXPECT_EQ(exp_threads, i.num_threads()); EXPECT_TRUE(i.threads().get() != nullptr); EXPECT_EQ(exp_threads, dynamic_cast<const ThreadStackExecutor&>(*i.threads()).getNumThreads()); @@ -27,7 +28,7 @@ expect_successful_init(uint32_t exp_threads) void expect_aborted_init(uint32_t exp_threads, uint32_t cfg_threads = 9) { - InitializeThreadsCalculator i("tmp", cfg_threads); + InitializeThreadsCalculator i(HwInfo::Cpu(cfg_threads), "tmp", cfg_threads); EXPECT_EQ(exp_threads, i.num_threads()); EXPECT_TRUE(i.threads().get() != nullptr); EXPECT_EQ(exp_threads, dynamic_cast<const ThreadStackExecutor&>(*i.threads()).getNumThreads()); @@ -53,7 +54,7 @@ TEST_F(InitializeThreadsCalculatorTest, initialize_threads_cut_in_half_when_init TEST_F(InitializeThreadsCalculatorTest, zero_initialize_threads_is_special) { { - InitializeThreadsCalculator i("tmp", 0); + InitializeThreadsCalculator i(HwInfo::Cpu(10), "tmp", 0); EXPECT_EQ(0, i.num_threads()); EXPECT_TRUE(i.threads().get() == nullptr); } @@ -61,4 +62,20 @@ TEST_F(InitializeThreadsCalculatorTest, zero_initialize_threads_is_special) expect_aborted_init(1, 0); } +void +expect_lower(uint32_t cores, uint32_t configured) { + InitializeThreadsCalculator i(HwInfo::Cpu(cores), "tmp", configured); + EXPECT_EQ(std::min(cores, configured), i.num_threads()); + i.init_done(); +} + +TEST_F(InitializeThreadsCalculatorTest, lower_of_wanted_and_cores) +{ + expect_lower(1, 7); + expect_lower(6, 7); + expect_lower(7, 7); + expect_lower(7, 6); + expect_lower(7, 1); +} + GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.cpp b/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.cpp index 17ddabebb65..bb1325acf04 100644 --- a/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.cpp @@ -39,10 +39,11 @@ const vespalib::string file_name = "initialize-threads.txt"; namespace proton { -InitializeThreadsCalculator::InitializeThreadsCalculator(const vespalib::string& base_dir, +InitializeThreadsCalculator::InitializeThreadsCalculator(const HwInfo::Cpu & cpu_info, + const vespalib::string& base_dir, uint32_t configured_num_threads) : _path(base_dir + "/" + file_name), - _num_threads(configured_num_threads), + _num_threads(std::min(cpu_info.cores(), configured_num_threads)), _threads() { if (std::filesystem::exists(_path)) { diff --git a/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.h b/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.h index 509db24ebf3..e7e1b22f181 100644 --- a/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.h +++ b/searchcore/src/vespa/searchcore/proton/server/initialize_threads_calculator.h @@ -2,6 +2,7 @@ #pragma once +#include <vespa/searchcore/proton/common/hw_info.h> #include <vespa/vespalib/stllike/string.h> #include <vespa/vespalib/util/threadexecutor.h> #include <filesystem> @@ -25,8 +26,7 @@ namespace proton { InitializeThreads _threads; public: - InitializeThreadsCalculator(const vespalib::string& base_dir, - uint32_t configured_num_threads); + InitializeThreadsCalculator(const HwInfo::Cpu & cpu_info, const vespalib::string& base_dir, uint32_t configured_num_threads); ~InitializeThreadsCalculator(); uint32_t num_threads() const { return _num_threads; } InitializeThreads threads() const { return _threads; } diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.cpp b/searchcore/src/vespa/searchcore/proton/server/proton.cpp index 8ec904760cf..7f3dc02aba8 100644 --- a/searchcore/src/vespa/searchcore/proton/server/proton.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/proton.cpp @@ -352,7 +352,7 @@ Proton::init(const BootstrapConfig::SP & configSnapshot) vespalib::string fileConfigId; _compile_cache_executor_binding = vespalib::eval::CompileCache::bind(_shared_service->shared_raw()); - InitializeThreadsCalculator calc(protonConfig.basedir, protonConfig.initialize.threads); + InitializeThreadsCalculator calc(hwInfo.cpu(), protonConfig.basedir, protonConfig.initialize.threads); LOG(info, "Start initializing components: threads=%u, configured=%u", calc.num_threads(), protonConfig.initialize.threads); _initDocumentDbsInSequence = (calc.num_threads() == 1); |