diff options
Diffstat (limited to 'src/mongo')
6 files changed, 31 insertions, 8 deletions
diff --git a/src/mongo/db/concurrency/d_concurrency_test.cpp b/src/mongo/db/concurrency/d_concurrency_test.cpp index ba3a3ada084..dc5790cb65f 100644 --- a/src/mongo/db/concurrency/d_concurrency_test.cpp +++ b/src/mongo/db/concurrency/d_concurrency_test.cpp @@ -37,6 +37,7 @@ #include "mongo/db/concurrency/replication_state_transition_lock_guard.h" #include "mongo/db/service_context_d_test_fixture.h" #include "mongo/db/storage/recovery_unit_noop.h" +#include "mongo/db/storage/storage_engine_parameters_gen.h" #include "mongo/db/storage/ticketholder_manager.h" #include "mongo/logv2/log.h" #include "mongo/stdx/future.h" @@ -71,6 +72,7 @@ class UseReaderWriterGlobalThrottling { public: explicit UseReaderWriterGlobalThrottling(ServiceContext* svcCtx, int numTickets) : _svcCtx(svcCtx) { + gStorageEngineConcurrencyAdjustmentAlgorithm = ""; // TODO SERVER-72616: Remove ifdefs once PriorityTicketHolder is available cross-platform. #ifdef __linux__ if constexpr (std::is_same_v<PriorityTicketHolder, TicketHolderImpl>) { diff --git a/src/mongo/db/storage/SConscript b/src/mongo/db/storage/SConscript index 19547976e7a..b7258d7da1c 100644 --- a/src/mongo/db/storage/SConscript +++ b/src/mongo/db/storage/SConscript @@ -218,6 +218,7 @@ env.Library( '$BUILD_DIR/mongo/db/server_base', '$BUILD_DIR/mongo/db/service_context', '$BUILD_DIR/mongo/util/concurrency/ticketholder', + '$BUILD_DIR/mongo/util/processinfo', 'storage_engine_feature_flags', ], ) diff --git a/src/mongo/db/storage/execution_control/throughput_probing.cpp b/src/mongo/db/storage/execution_control/throughput_probing.cpp index 5087318776a..58040618713 100644 --- a/src/mongo/db/storage/execution_control/throughput_probing.cpp +++ b/src/mongo/db/storage/execution_control/throughput_probing.cpp @@ -30,6 +30,7 @@ #include "mongo/db/storage/execution_control/throughput_probing.h" #include "mongo/db/storage/execution_control/throughput_probing_gen.h" #include "mongo/logv2/log.h" +#include "mongo/util/processinfo.h" #define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kStorage @@ -40,7 +41,14 @@ ThroughputProbing::ThroughputProbing(ServiceContext* svcCtx, TicketHolder* writeTicketHolder, Milliseconds interval) : TicketHolderMonitor(svcCtx, readTicketHolder, writeTicketHolder, interval), - _stableConcurrency(_readTicketHolder->outof()) {} + _stableConcurrency(throughput_probing::gInitialConcurrency + ? throughput_probing::gInitialConcurrency + : std::clamp(static_cast<int32_t>(ProcessInfo::getNumCores()), + kMinConcurrency, + kMaxConcurrency)) { + _readTicketHolder->resize(_stableConcurrency); + _writeTicketHolder->resize(_stableConcurrency); +} void ThroughputProbing::appendStats(BSONObjBuilder& builder) const { _stats.serialize(builder); diff --git a/src/mongo/db/storage/execution_control/throughput_probing.idl b/src/mongo/db/storage/execution_control/throughput_probing.idl index 68a7ad559c5..f4418f6083e 100644 --- a/src/mongo/db/storage/execution_control/throughput_probing.idl +++ b/src/mongo/db/storage/execution_control/throughput_probing.idl @@ -38,3 +38,15 @@ server_parameters: validator: gte: 0.1 lte: 0.5 + + throughputProbingInitialConcurrency: + description: >- + The initial number of concurrent read/write transactions for throughput probing. The default + value of 0 means to use the number of logical CPU cores. + set_at: startup + cpp_vartype: int32_t + cpp_varname: gInitialConcurrency + default: 0 + validator: + gte: 5 + lte: 128 diff --git a/src/mongo/db/storage/execution_control/throughput_probing_test.cpp b/src/mongo/db/storage/execution_control/throughput_probing_test.cpp index 340cb616b5a..d2da4844ea9 100644 --- a/src/mongo/db/storage/execution_control/throughput_probing_test.cpp +++ b/src/mongo/db/storage/execution_control/throughput_probing_test.cpp @@ -28,6 +28,7 @@ */ #include "mongo/db/storage/execution_control/throughput_probing.h" +#include "mongo/db/storage/execution_control/throughput_probing_gen.h" #include "mongo/unittest/unittest.h" namespace mongo::execution_control { @@ -85,8 +86,10 @@ protected: svcCtx->setPeriodicRunner(std::move(runner)); return runnerPtr; }()), - _readTicketHolder(size), - _writeTicketHolder(size) {} + _throughputProbing([&]() -> ThroughputProbing { + throughput_probing::gInitialConcurrency = size; + return {_svcCtx.get(), &_readTicketHolder, &_writeTicketHolder, Milliseconds{1}}; + }()) {} void _run() { _runner->run(_client.get()); @@ -99,8 +102,7 @@ protected: MockTicketHolder _readTicketHolder; MockTicketHolder _writeTicketHolder; - ThroughputProbing _througputProbing{ - _svcCtx.get(), &_readTicketHolder, &_writeTicketHolder, Milliseconds{1}}; + ThroughputProbing _throughputProbing; }; class ThroughputProbingMaxConcurrencyTest : public ThroughputProbingTest { diff --git a/src/mongo/util/concurrency/ticketholder.h b/src/mongo/util/concurrency/ticketholder.h index 6b362d6d395..e2325120385 100644 --- a/src/mongo/util/concurrency/ticketholder.h +++ b/src/mongo/util/concurrency/ticketholder.h @@ -238,8 +238,6 @@ protected: class MockTicketHolder : public TicketHolder { public: - explicit MockTicketHolder(int32_t outof) : _outof(outof) {} - void resize(int32_t newSize) noexcept override { _outof = newSize; } @@ -288,7 +286,7 @@ private: int32_t _used = 0; int32_t _peakUsed = 0; - int32_t _outof; + int32_t _outof = 0; int32_t _numFinishedProcessing = 0; }; |